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() {
|
|
NotificationServer.register("switch off", switchOff);
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
private void switchOff(object _)
|
|
{
|
|
rb.velocity = Vector3.zero;
|
|
}
|
|
|
|
|
|
}
|