コード例 #1
0
    // Update is called once per frame
    void Update()
    {
        bezierPath script = GameObject.Find("bezierPath").GetComponent <bezierPath>();

        if (positionPointer == 0)
        {
            uint  i    = 0;
            float dist = Vector3.Distance(script.vertices[(int)i], transform.position);
            float dist2;
            //Vector3 closestVertex;
            foreach (Vector3 vertex in script.vertices)
            {
                dist2 = Vector3.Distance(transform.position, vertex);
                if (dist > dist2)
                {
                    dist            = dist2;
                    positionPointer = i++;
                }
            }
        }
        else
        {
            float predecessor = Vector3.Distance(transform.position, script.vertices[(int)positionPointer - 1]);
            float successor   = Vector3.Distance(transform.position, script.vertices[(int)positionPointer + 1]);
            float actual      = Vector3.Distance(transform.position, script.vertices[(int)positionPointer]);
            if (predecessor < actual)
            {
                positionPointer--;
            }
            if (successor < actual)
            {
                positionPointer++;
            }
            if (positionPointer > 99)
            {
                positionPointer = 99;
            }
        }
        //print (Vector3.Distance(transform.position,script.vertices[(int)positionPointer])+"<<<<<<<<<<<<<");
        rotateToNoCollisionDirection();
        Debug.DrawLine(transform.position, transform.position + transform.forward, Color.white);
    }
コード例 #2
0
    bool rotateToNoCollisionDirection()
    {
        bool    colliding    = false;
        Vector3 forwardPoint = transform.forward + transform.position;
        //print ("number of colliding objects = "+collidingObjects.Count);
        bezierPath script = GameObject.Find("bezierPath").GetComponent <bezierPath>();

        //print(Vector3.Distance (forwardPoint, script.vertices [(int)positionPointer])+">>>>>>"+script.tunelScale);

        if (collidingObjects.Count != 0 ||
            Vector3.Distance(forwardPoint, script.vertices [(int)positionPointer]) > script.tunelScale)
        {
            //print ("colliding");

            rigidbody.velocity = Vector3.zero;
            foreach (GameObject o in collidingObjects)
            {
                if (o == null)
                {
                    continue;
                }
                float radius = (o.GetComponent <SphereCollider>().radius *o.transform.localScale.x);
                //print (o.GetComponent<SphereCollider>().radius+"    "+o.transform.localScale.x);


                if (Vector3.Distance(forwardPoint, o.transform.position) < radius ||
                    Vector3.Distance(forwardPoint, script.vertices [(int)positionPointer]) > script.tunelScale)
                {
                    for (int i = 0; i < 20; i++)
                    {
                        transform.Rotate(Random.Range(180, -180), Random.Range(180, -180), Random.Range(180, -180));
                        if (Vector3.Distance(forwardPoint, o.transform.position) > radius)
                        {
                            //print ("break for- matching right angles");
                            break;
                        }
                        else if (Vector3.Distance(forwardPoint, script.vertices [(int)positionPointer]) < script.tunelScale)
                        {
                            break;
                        }
                    }
                }
                else
                {
                    //print("error of detection "+Vector3.Distance(forwardPoint,o.transform.position) +"< radius=" + radius);
                }
            }
            if (Vector3.Distance(forwardPoint, script.vertices [(int)positionPointer]) > script.tunelScale)
            {
                for (int i = 0; i < 20; i++)
                {
                    transform.Rotate(Random.Range(180, -180), Random.Range(180, -180), Random.Range(180, -180));
                    if (Vector3.Distance(forwardPoint, script.vertices [(int)positionPointer]) < script.tunelScale)
                    {
                        break;
                    }
                }
            }

            foreach (GameObject o in collidingObjects)
            {
                if (o == null)
                {
                    continue;
                }
                float radius = o.GetComponent <SphereCollider>().radius *o.transform.localScale.x;
                if (Vector3.Distance(forwardPoint, o.transform.position) < radius)
                {
                    //print ("colliding=true");
                    colliding = true;
                }
                else if (Vector3.Distance(forwardPoint, script.vertices [(int)positionPointer]) > script.tunelScale)
                {
                    colliding = true;
                }
            }
        }
        if (colliding == false)
        {
            rigidbody.velocity = transform.forward * speed;
        }
        return(colliding);
    }