// 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; }
// Use this for initialization public void Start() { // StartCoroutine(StateController()); targetReached = true; state = GLURTSUnitState.reserved; }