public void RemoveReachedEvent(OnReachedEvent _reachedEvent)
 {
     reachedEvent -= _reachedEvent;
 }
Esempio n. 2
0
    //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;
 }
Esempio n. 4
0
 public void SetOnReachedEvent(OnReachedEvent _event)
 {
     onReachedEvent = _event;
 }