void OnCollisionEnter(Collision collision) { if (collision.gameObject.layer == agentLayer) { ApiManager.Instance?.AddCollision(gameObject, collision.gameObject, collision); SimulatorManager.Instance.AnalysisManager.IncrementNPCCollision(); ActiveBehaviour?.OnAgentCollision(collision.gameObject); } }
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(); } }
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); }