Files
UltimateFishing2020/Assets/Scripts/Assembly-CSharp/WaterInteractive.cs
2026-03-04 10:03:45 +08:00

158 lines
3.4 KiB
C#

using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
public class WaterInteractive : MonoBehaviour
{
private Rigidbody _rigidbody;
[HideInInspector]
public Vector3 deepProbe;
private FishSystem fishSystem;
[HideInInspector]
public BaitStats baitStats;
public bool useFxWater = true;
public GameObject ripplePrefab;
private ParticleSystem smuuggeParticle;
[Range(0.1f, 1f)]
public float objectDisplacement = 0.1f;
public float deepForVelocity = 0.1f;
public float waterDisplacment = 2f;
private float startDrag;
public bool useBouncy;
private float bouncePower;
private float deepVeloPower;
private float veloMag;
private Vector3 velo;
private Collider m_Collider;
private void Start()
{
fishSystem = Object.FindObjectOfType<FishSystem>();
baitStats = GetComponent<BaitStats>();
_rigidbody = GetComponent<Rigidbody>();
startDrag = _rigidbody.drag;
m_Collider = GetComponent<Collider>();
if (useFxWater)
{
AddRipple();
}
}
private void Update()
{
}
private void FixedUpdate()
{
deepProbe = ProbeDeep();
velo = _rigidbody.velocity;
velo.y = 0f;
veloMag = velo.magnitude;
if (useBouncy)
{
bouncePower = 0.01f + Mathf.PingPong(Time.time * 0.015f, 0.015f);
}
deepVeloPower = veloMag * Mathf.Abs(deepForVelocity);
if (deepProbe.y > 0f)
{
_rigidbody.drag = startDrag * 3f;
base.transform.position = Vector3.MoveTowards(base.transform.position, new Vector3(base.transform.position.x, deepProbe.z + bouncePower, base.transform.position.z), Time.deltaTime * (waterDisplacment * objectDisplacement));
_rigidbody.AddForce(Vector3.up * deepForVelocity * deepVeloPower, ForceMode.Acceleration);
}
else
{
_rigidbody.drag = startDrag;
}
ShowWaterFX();
}
private Vector3 ProbeDeep()
{
int mask = LayerMask.GetMask("Terrain");
Vector3 zero = Vector3.zero;
if (Physics.Raycast(base.transform.position, -Vector3.up, out var hitInfo, float.PositiveInfinity, mask))
{
zero.x = hitInfo.distance;
}
int mask2 = LayerMask.GetMask("WaterObject");
if (Physics.Raycast(base.transform.position, Vector3.up, out var hitInfo2, float.PositiveInfinity, mask2))
{
zero.y = hitInfo2.distance;
zero.z = hitInfo2.point.y;
}
return zero;
}
private void AddRipple()
{
if (!(ripplePrefab == null))
{
GameObject gameObject = Object.Instantiate(ripplePrefab, base.transform);
gameObject.transform.localPosition = Vector3.zero;
gameObject.transform.localEulerAngles = Vector3.zero;
smuuggeParticle = gameObject.GetComponent<ParticleSystem>();
}
}
private void ShowWaterFX()
{
if (smuuggeParticle == null)
{
return;
}
if (base.transform.position.y >= deepProbe.z - GetMinDeep() * 6f && deepProbe.z + GetMinDeep() * 5f >= base.transform.position.y)
{
smuuggeParticle.gameObject.transform.localScale = Vector3.one * (0.1f + base.transform.localScale.y * 0.02f);
if (!smuuggeParticle.isPlaying)
{
smuuggeParticle.Play();
}
}
else if (smuuggeParticle.isPlaying)
{
smuuggeParticle.Stop();
}
}
private float GetMinDeep()
{
return m_Collider.bounds.size.y / 4f;
}
public void ForceByWaterCurrent(Vector3 direction, float powerForce)
{
if (deepProbe.z > base.transform.position.y)
{
_rigidbody.AddForce(direction * powerForce, ForceMode.Acceleration);
}
}
private void OnTriggerEnter(Collider other)
{
}
private void OnTriggerExit(Collider other)
{
}
private void OnDisable()
{
_ = fishSystem == null;
}
}