using UnityEngine;
using System.Collections;
using WaterSystem;
using Unity.Mathematics;
using Unity.Entities;
namespace BoatAttack.Boat
{
public class Engine : MonoBehaviour
{
public Rigidbody RB; // The rigid body attatched to the boat
public Vector3 vel; // Boats velocity
public AudioSource engineSound; // Engine sound clip
public AudioSource waterSound; // Water sound clip
//engine stats
public float steeringTorque = 5f;
public float upwardTorque = 5f;
public float horsePower = 18f;
private float3[] point = new float3[1]; // engine submerged check
private float3[] heights = new float3[1]; // engine submerged check
private int _guid;
private float yHeight;
public Vector3 enginePosition;
private Vector3 engineDir;
void Awake()
{
if(engineSound)
engineSound.time = UnityEngine.Random.Range(0f, engineSound.clip.length); // randomly start the engine sound
if(waterSound)
waterSound.time = UnityEngine.Random.Range(0f, waterSound.clip.length); // randomly start the water sound
_guid = GetInstanceID(); // Get the engines GUID for the buoyancy system
}
void FixedUpdate()
{
vel = RB.velocity; // store the velocity
float velMag = vel.sqrMagnitude; // get the sqr mag
engineSound.pitch = Mathf.Max(velMag * 0.01f, 0.3f); // use some magice numbers to control the pitch of the engine sound
// Get the water level from the engines position and store it
point[0] = transform.TransformPoint(enginePosition);
GerstnerWavesJobs.UpdateSamplePoints(point, _guid, false);
GerstnerWavesJobs.GetData(_guid, ref heights);
yHeight = heights[0].y - point[0].y;
}
///
/// Controls the acceleration of the boat
///
/// Acceleration modifier, adds force in the 0-1 range
public void Accel(float modifier)
{
if (yHeight > -0.1f) // if the engine is deeper than 0.1
{
modifier = Mathf.Clamp(modifier, 0f, 1f); // clamp for reasonable values
Vector3 forward = transform.forward;
forward.y = 0f;
forward.Normalize();
RB.AddForce(forward * modifier * horsePower, ForceMode.Acceleration); // add force forward based on input and horsepower
RB.AddRelativeTorque(-Vector3.right * modifier, ForceMode.Acceleration);
}
}
///
/// Controls the turning of the boat
///
/// Steering modifier, positive for right, negative for negative
public void Turn(float modifier)
{
if (yHeight > -0.1f) // if the engine is deeper than 0.1
{
modifier = Mathf.Clamp(modifier, -1f, 1f); // clamp for reasonable values
RB.AddRelativeTorque(new Vector3(0f, steeringTorque, -steeringTorque * 0.5f) * modifier, ForceMode.Acceleration); // add torque based on input and torque amount
}
}
// Draw some helper gizmos
void OnDrawGizmosSelected()
{
Gizmos.color = Color.green;
Gizmos.matrix = transform.localToWorldMatrix;
Gizmos.DrawCube(enginePosition, new Vector3(0.1f, 0.2f, 0.3f)); // Draw teh engine position with sphere
}
//Called by parent BuoyantObject_DOTS
public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
{
//Set up driving data
bool isHuman = GetComponent().Human;
if (!isHuman)
AIController_DOTS.Register(entity, transform.position);
var driveData = new DrivingData
{
steeringTorque = steeringTorque,
upwardTorque = upwardTorque,
horsePower = horsePower,
engineOffset = enginePosition
};
dstManager.AddComponentData(entity, driveData);
var inputData = new InputData
{
isHuman = isHuman
};
dstManager.AddComponentData(entity, inputData);
}
}
}