using System.Collections; using System.Collections.Generic; using UnityEngine; public class ShootingSpike : MonoBehaviour { public float range = 20f; public LayerMask collisionMask; public float acceleration = 25f; public float maxSpeed = 12.5f; private Collider hitCollider; private Vector3 triggerRayOrigin; private Vector3 triggerRayDirection; private float speed; private Vector3 moveDirection; private bool isMoving; // Start is called before the first frame update void Start() { isMoving = false; hitCollider = GetComponent(); } // Update is called once per frame void Update() { if (isMoving) { speed += acceleration * Time.deltaTime; if (speed > maxSpeed) { speed = maxSpeed; } Vector3 hitRayOrigin = transform.position + transform.up * transform.localScale.y; Vector3 hitRayDirection = transform.TransformDirection(0, 1, 0); RaycastHit hit; if (Physics.Raycast(hitRayOrigin, hitRayDirection, out hit, speed * Time.deltaTime, collisionMask)) { if (hit.collider.gameObject.layer == 11) { Destroy(gameObject); return; } } else { Debug.DrawRay(hitRayOrigin, hitRayDirection * speed * Time.deltaTime, Color.green); } transform.position += moveDirection * speed * Time.deltaTime; } if (!isMoving) { triggerRayOrigin = transform.position + transform.up * transform.localScale.y; triggerRayDirection = transform.TransformDirection(0, 1, 0); RaycastHit hit; if (Physics.Raycast(triggerRayOrigin, triggerRayDirection, out hit, range, collisionMask)) { if (hit.collider.gameObject.layer == 11) { Debug.DrawRay(triggerRayOrigin, triggerRayDirection * hit.distance, Color.green); } if (hit.collider.gameObject.layer == 10) { Debug.DrawRay(triggerRayOrigin, triggerRayDirection * hit.distance, Color.red); isMoving = true; moveDirection = triggerRayDirection; } } else { Debug.DrawRay(triggerRayOrigin, triggerRayDirection * range, Color.green); } } } void OnTriggerEnter(Collider other) { Debug.LogFormat("Falling spike collided with other: {0}", other); } }