示例#1
0
    // Update is called once per frame
    public void Update()
    {
        if (health <= 0)
        {
            return;
        }

        if (targetReached)
        {
            targetReached = false;
            state         = GetNewState();
            leftFlashLight.ToogleActive(false);
            rightFlashLight.ToogleActive(false);
            smoke.Stop();
            //stateChangeTime = GetNextStateChangeTime();

            switch (state)
            {
            case GLURTSUnitState.standing:
                standingTime = GetNextStateChangeTime();
                break;

            case GLURTSUnitState.moving:
                target = GetNewTarget();

                // rotationTarget = Quaternion.FromToRotation(Vector3.right, target).eulerAngles.y;
                // rotationTarget = ClampAngle(Quaternion.LookRotation(target - transform.position).eulerAngles.y);
                startPosition   = transform.position;
                rotationTarget  = ClampAngle(Quaternion.LookRotation(target - startPosition).eulerAngles.y);
                targetDistance  = (target - startPosition).magnitude;
                justStartMoving = true;
                rotating        = true;
                rotator.ToogleActive(true);
                smoke.Play();
                currentVelocity = (target - startPosition).normalized * movingSpeed;

                break;

            default:
                break;
            }
        }

        switch (state)
        {
        case GLURTSUnitState.moving:
            if (rotating)
            {
                float ca = ClampAngle(transform.rotation.eulerAngles.y);
                float na;
                float rd = rotationTarget - ca;

                /* if (Mathf.Abs(rd) > 180)
                 *  na = ca - Mathf.Sign(rd) * rotationSpeed * Time.deltaTime;
                 * else */
                na = ca + Mathf.Sign(rd) * rotationSpeed * Time.deltaTime;

                if (Mathf.Abs(rotationTarget - ca) < Mathf.Abs(rotationTarget - na))
                {
                    rotating = false;
                    rotator.ToogleActive(false);
                }
                else
                {
                    Vector3 ea = transform.rotation.eulerAngles;
                    transform.rotation = Quaternion.Euler(ea.x, na, ea.z);
                }
            }
            else
            {
                Vector3 v;
                float   w = (transform.position - startPosition).magnitude;
                if (w + 0.1f < accelerationWayLength)
                {
                    v = currentVelocity * Time.deltaTime * (w + 0.1f) / accelerationWayLength;
                }
                else
                {
                    v = currentVelocity * Time.deltaTime;
                }

                if (w > targetDistance - accelerationWayLength)
                {
                    v = currentVelocity * Time.deltaTime * (targetDistance - w + 0.1f) / accelerationWayLength;
                }
                else
                {
                    v = currentVelocity * Time.deltaTime;
                }

                Ray        r = new Ray(transform.position, v);
                RaycastHit hit;
                collider.enabled = false;
                // if (Physics.SphereCast(r, collisionRadius, out hit, v.magnitude))
                if (Physics.Raycast(r, out hit, collisionRadius + v.magnitude))
                {
                    if (debug)
                    {
                        Debug.Log(this + " collision with " + hit.collider.gameObject.name);
                    }
                    targetReached = true;
                    if (!justStartMoving)
                    {
                        FireCollision();
                    }
                }
                else
                if ((target - transform.position).magnitude < (target - transform.position - v).magnitude)
                {
                    if (rallyIsSet)
                    {
                        if ((rally - transform.position - v).magnitude < 1)
                        {
                            rallyIsSet = false;
                        }
                    }
                    transform.position = target;
                    targetReached      = true;
                }
                else
                {
                    transform.position += v;
                }
                justStartMoving  = false;
                collider.enabled = true;
                if (Time.time > flashingCommutationTime && rallyIsSet)
                {
                    leftFlashLight.ToogleActive(!leftFlashLight.IsActive());
                    rightFlashLight.ToogleActive(!rightFlashLight.IsActive());
                    flashingCommutationTime = Time.time + flashingInterval;
                }
            }
            break;

        case GLURTSUnitState.reserved:
            // if (Time.time >= standingTime)
            targetReached = true;
            break;

        case GLURTSUnitState.standing:
            if (Time.time >= standingTime)
            {
                targetReached = true;
            }
            break;
        }

        if (collisionInProgress)
        {
            if (Time.time > collisionhideTime)
            {
                collisionInProgress = false;
                sparcs.gameObject.ToogleActive(false);
                sparcs.Stop();
            }
        }
        // renderer.sharedMaterial = material;
    }
示例#2
0
 // Use this for initialization
 public void Start()
 {
     // StartCoroutine(StateController());
     targetReached = true;
     state         = GLURTSUnitState.reserved;
 }