|
|
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- public class BoatController : BuoyantObject {
-
- public float trunSpeed = 0.5f;
- public float breakSpeed = 20f;
- [Range(0.8f,1)]
- public float stopRatio = 0.95f;
-
- private bool applyBreak = true;
-
-
- // Use this for initialization
- void Start() {
-
- }
-
- void Update() {
- lookAtDir(Vector3.ProjectOnPlane(rb.velocity, Vector3.up));
- }
-
- void FixedUpdate() {
-
- doBreak();
- }
-
- // Update is called once per frame
- void lookAtDir(Vector3 inputDir) {
- if (inputDir == Vector3.zero)
- return;
- Quaternion targetRotation = Quaternion.LookRotation(inputDir, Vector3.up);
- float str = Mathf.Min(trunSpeed * Time.deltaTime, 1);
- transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, str);
- }
-
- void OnCollisionEnter(Collision collision) {
- if (collision.gameObject.CompareTag("Rock")) {
-
- float forwardHitSpeed = Vector3.Project(collision.relativeVelocity, transform.forward).magnitude;
-
- // Debug.Log("Forward hit:" + forwardHitSpeed);
- if (forwardHitSpeed > breakSpeed) {
- NotificationServer.notify("play sfx", "runAground:1");
- PlayerController.instance.takeOneDamage();
- }
- }
- }
-
-
- private void doBreak() {
- if (!applyBreak)
- return;
-
- Vector3 vel = rb.velocity;
- Vector3 flatVel = Vector3.ProjectOnPlane(vel, Vector3.up);
-
- flatVel *= stopRatio;
- flatVel.y = vel.y;
- rb.velocity = flatVel;
- }
-
- public override IEnumerator pushObject(Vector3 point, float power, float totalTime) {
- Vector3 dir = transform.position - point;
- dir = Vector3.ProjectOnPlane(dir, Vector3.up);
- dir.Normalize();
-
- float elapsedTime = 0;
-
- Vector3 force = dir * power;
- rb.AddForce(force,ForceMode.Impulse);
-
- while (elapsedTime < totalTime) {
- applyBreak = false;
-
- force = dir * power * Time.deltaTime;
- rb.AddForce(force);
-
- yield return new WaitForEndOfFrame();
-
- elapsedTime += Time.deltaTime;
- }
- applyBreak = true;
- }
-
-
-
-
- }
|