====== Water Behaviour ====== {{page>scripting-api#WaterBehaviour}} ===== Example Implementation ===== This implementation shows how to make cannon ball detecting collision with water. \\ It is used in attached Dragon Water Demo game. [RequireComponent(typeof(Rigidbody))] public class CannonBall : WaterBehaviour { [SerializeField] float speed; [SerializeField] ParticleSystem trailParticle; [SerializeField] GameObject explosionMediumPrefab; [SerializeField] GameObject explosionLargePrefab; [SerializeField] GameObject splashPrefab; [SerializeField] float shipExplosionForce; [SerializeField] float shipExplosionRadius; Rigidbody _rigidbody; protected override void Awake() { base.Awake(); _rigidbody = GetComponent(); } private void Start() { _rigidbody.velocity = transform.forward * speed; } protected override void InnerFixedUpdate() { if (GetResultCount() > 0) { var hit = GetResult(0); if (hit.HasHit && hit.IsUnderwater) { HitWater(); } } if (isSchedulingFrane) { PrepareSamplingPointsSize(1); SetSamplingPoint(0, transform.position); } } private void OnCollisionEnter(Collision collision) { var ship = collision.gameObject.GetComponentInParent(); if (ship != null) { HitShip(ship); } else { HitOther(); } } private void HitShip(ShipController ship) { ship.FloatingBody.Rigidbody.AddExplosionForce(shipExplosionForce, transform.position, shipExplosionRadius); Instantiate(explosionLargePrefab, transform.position, Quaternion.identity); DestroyBall(); } private void HitOther() { Instantiate(explosionMediumPrefab, transform.position, Quaternion.identity); DestroyBall(); } private void HitWater() { Instantiate(splashPrefab, transform.position, Quaternion.identity); DestroyBall(); } private void DestroyBall() { var scale = trailParticle.transform.localScale; trailParticle.transform.SetParent(null, true); trailParticle.transform.localScale = scale; trailParticle.Stop(); trailParticle.AddComponent().delay = 5; Destroy(gameObject); } }