public void OnCollisionEnter(CollisionData data) { //TriggerAreaBaseClass triggerArea = GetScriptClass<TriggerAreaBaseClass>(data.collidedObj, false); //if (triggerArea != null) // If colliding against a trigger area //{ // triggerArea.OnAreaEnter(); //} if (playerCamScript.GetIsDead()) { return; } List <TriggerAreaBaseClass> triggers = new List <TriggerAreaBaseClass>(); triggers = GetScripts <TriggerAreaBaseClass>(data.collidedObj, false); if (triggers.Count > 0) { foreach (TriggerAreaBaseClass obj in triggers) { obj.OnAreaEnter(); } } else // If colliding against a real object { if (!canJump) { // Check if landed on the floor Vector3 upVec = new Vector3(0, 1, 0); for (int i = 0; i < data.numContacts; ++i) { // if it's A then flip normal Vector3 normal = data.normals[i]; if (data.isA) // if { normal *= -1.0f; } float dotPro = Vector3.Dot(normal, upVec); // still can't jump if (dotPro <= 0) { return; } } // If all dot products are > 0, then landed on floor canJump = true; } } }
public void OnUpdate() { float dt = FrameController.DT(); Vector3 turretToPlayer = (Vector3)player.transform.position - (Vector3)gameObject.transform.position; turretToPlayer.Y = 0.0f; float turretToPlayerSq = Vector3.Dot(turretToPlayer, turretToPlayer); if (turretToPlayerSq > radiusOfFire * radiusOfFire) { return; // Do not update if player is too far away } if (currentState == 0) { timerToStayOnGuard -= dt; if (!playerCamScript.GetIsDead()) // Do not need to update if player is already dead { // Check if player is within sights, and not hiding behind a wall Vector3 turretDir = gameObject.transform.GetForwardVector(); float dotPdt = Vector3.Dot(turretToPlayer, turretDir); // dotPdt^2 = lengthSq * cos(angle)^2. The smaller the angle, the larger the dot pdt if ((dotPdt > 0.0f) && (dotPdt * dotPdt >= cosAngleArcOfFire * cosAngleArcOfFire * turretToPlayerSq)) { turretToPlayer.Normalize(); Vector3 turretPos = (Vector3)gameObject.transform.position; turretPos.Y = 1.0f; // Raycast towards player and check if he is behind a wall GameObject wall = PhysicEngine.getInstance().RayCast3DWithTag( turretPos, turretToPlayer, 10000.0f, "TurretWall"); if (wall == null) { mSound.PlayIndependentEvent("Turret_LaserShot.vente", false, 1); playerCamScript.Kill(); } } } if (timerToStayOnGuard <= 0.0f) { timerToRotate = TIME_TO_ROTATE; // Reset the timer currentState = 1; // Start rotating // mSound.Play("Turret_Targetting.vente"); //Turret_Rotate.vente"); startAngle = gameObject.transform.rotation.Angles.y; // Save current angle // Select the angle to rotate to currAngleIndex = (currAngleIndex + 1 >= angleList.Count) ? 0 : currAngleIndex + 1; } } else // rotating { timerToRotate -= dt; // Tween the turret's rotation to target angle gameObject.transform.rotation.Angles.y += (angleList[currAngleIndex] - startAngle) / TIME_TO_ROTATE * dt; if (timerToRotate <= 0.0f) { gameObject.transform.rotation.Angles.y = angleList[currAngleIndex]; currentState = 0; // Start rotating timerToStayOnGuard = TIME_TO_ON_GUARD; } } }