Пример #1
0
 void OnCollisionEnter(Collision collision)
 {
     if (collision.gameObject.layer == agentLayer)
     {
         ApiManager.Instance?.AddCollision(gameObject, collision.gameObject, collision);
         SimulatorManager.Instance.AnalysisManager.IncrementNPCCollision();
         ActiveBehaviour?.OnAgentCollision(collision.gameObject);
     }
 }
Пример #2
0
    public void PhysicsUpdate()
    {
        if (!gameObject.activeInHierarchy)
        {
            return;
        }

        if (wheels.Count < 4)
        {
            Vector3 newLeft   = Vector3.Cross(transform.forward, Vector3.up);
            Vector3 desiredUp = Vector3.Cross(transform.forward, newLeft);
            if (desiredUp.y < 0)
            {
                desiredUp = -desiredUp;
            }

            Quaternion delta = Quaternion.FromToRotation(transform.up, desiredUp);
            delta.ToAngleAxis(out float angle, out Vector3 axis);
            Vector3 torque = axis * (angle * adjustFactor - rb.angularVelocity.z * dampenFactor);

            rb.AddTorque(torque, ForceMode.Acceleration);
        }

        if (Time.fixedDeltaTime > 0)
        {
            var previousVelocity = simpleVelocity;
            simpleVelocity     = (rb.position - lastRBPosition) / Time.fixedDeltaTime;
            simpleAcceleration = simpleVelocity - previousVelocity;

            Vector3 euler1 = lastRBRotation.eulerAngles;
            Vector3 euler2 = rb.rotation.eulerAngles;
            Vector3 diff   = euler2 - euler1;
            for (int i = 0; i < 3; i++)
            {
                diff[i] = (diff[i] + 180) % 360 - 180;
            }
            simpleAngularVelocity = diff / Time.fixedDeltaTime * Mathf.Deg2Rad;
            SetLastPosRot(rb.position, rb.rotation);
        }

        if (ActiveBehaviour)
        {
            ActiveBehaviour.PhysicsUpdate();
        }

        if (currentSpeed > 0.1f)
        {
            WheelMovement();
        }
    }
Пример #3
0
    internal NPCBehaviourBase SetBehaviour(Type t)
    {
        if (ActiveBehaviour != null && ActiveBehaviour.GetType().IsAssignableFrom(t))
        {
            return(_ActiveBehaviour);
        }

        if (_ActiveBehaviour != null)
        {
            Destroy(_ActiveBehaviour);
            _ActiveBehaviour = null;
        }

        NPCBehaviourBase behaviour = (NPCBehaviourBase)gameObject.AddComponent(t);

        _ActiveBehaviour            = behaviour;
        _ActiveBehaviour.controller = this;
        _ActiveBehaviour.rb         = rb;
        _ActiveBehaviour.Init(_seed);
        return(behaviour);
    }