public void RemoveReachedEvent(OnReachedEvent _reachedEvent) { reachedEvent -= _reachedEvent; }
//void OnCdollisionEnter(Collision col) //{ // if (!isDrawable) // return; // if (col.gameObject.layer != LayerMask.NameToLayer("ground")) // return; // Debug.DrawLine(col.contacts[0].point, col.contacts[0].point + col.contacts[0].normal * 10, Color.cyan, 5); // Vector3 point = col.contacts[0].point + col.contacts[0].normal * (0.4f); // AddNode(point,col.contacts[0].normal, col.transform); //} //public void ColliderUpdate() //{ // transform.position = tailRendererPos; // if (nodes.Count == 0) // { // if (headRendererPos == tailRendererPos) // return; // Vector3 dir = headRendererPos - tailRendererPos; // rigidbody.transform.localScale = new Vector3(1, 1, Vector3.Distance(headRendererPos, tailRendererPos)); // rigidbody.MoveRotation(Quaternion.LookRotation(dir.normalized)); // } // else // { // Vector3 dir = tailNode.position - tailRendererPos; // rigidbody.transform.localScale = new Vector3(1, 1, Vector3.Distance(tailRendererPos, tailNode.position)); // rigidbody.MoveRotation(Quaternion.LookRotation(dir.normalized)); // } //} //public void ColliderInit() //{ // transform.position = tailRendererPos; // rigidbody.transform.localScale = new Vector3(1, 1,0); //} public IEnumerator Trace(bool isTailToHead = true) { Rigidbody tracerRigid = (isTailToHead) ? tailConnectedRigid : /*(headConnectedRigid)?headConnectedRigid:*/ headObject.GetComponent <Rigidbody>(); Vector3 tracerVelocity = Vector3.zero; tracerRigid.velocity = Vector3.zero; bool reached = false; NodeData currentNode; Vector3 dest = Vector3.zero; Vector3 startPoint; lastDistance = -1; while (!reached) { currentNode = (nodes.Count == 0) ? null : (isTailToHead) ? tailNode : headNode; dest = (nodes.Count > 0) ? currentNode.position : (isTailToHead) ? headConnectedRigid.transform.TransformPoint(headConnectedOffset) : tailConnectedRigid.transform.TransformPoint(tailConnectedOffset); startPoint = (isTailToHead) ? tailConnectedRigid.transform.TransformPoint(tailConnectedOffset) : headConnectedRigid.transform.TransformPoint(headConnectedOffset); float distanceBetweenDest = Vector3.Distance(tracerRigid.position, dest); if (distanceBetweenDest < traceDistance) { if (nodes.Count > 0) { nodes.Remove(currentNode); lastDistance = -1; distanceBetweenDest = Vector3.Distance(tracerRigid.position, dest); currentNode = (nodes.Count == 0) ? null : (isTailToHead) ? tailNode : headNode; dest = (nodes.Count > 0) ? currentNode.position : (isTailToHead) ? headConnectedRigid.transform.TransformPoint(headConnectedOffset) : tailConnectedRigid.transform.TransformPoint(tailConnectedOffset); } else { reached = true; break; //transform.position = dest; } } if (!reached) { float d = Vector3.Distance(tracerRigid.position, dest); tracerVelocity = (dest - startPoint).normalized * movingSpeed; Vector3 newVelocity = Vector3.MoveTowards(tracerRigid.velocity, tracerVelocity, Time.deltaTime * ((nodes.Count == 0 && d < 6)?90:(nodes.Count == 0)?60:30)); Vector3 dir = (isTailToHead) ? (dest - startPoint).normalized : (startPoint - dest).normalized; Vector3 newEuler = Quaternion.LookRotation(dir).eulerAngles; tracerRigid.transform.rotation = Quaternion.RotateTowards(tracerRigid.rotation, Quaternion.Euler(newEuler), 5); tracerRigid.velocity = newVelocity; lastDistance = d; CrossProductUpdateToHead(); CrossProductUpdateToTail(); } yield return(new WaitForFixedUpdate()); } if (onReachedEvent != null) { onReachedEvent(); } onReachedEvent = null; transform.localScale = Vector3.zero; tracerRigid.velocity = Vector3.zero; isDrawable = false; yield return(null); }
public void AddReachedEvent(OnReachedEvent _reachedEvent) { reachedEvent += _reachedEvent; }
public void SetOnReachedEvent(OnReachedEvent _event) { onReachedEvent = _event; }