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;
            }
        }
    }
예제 #2
0
    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;
            }
        }
    }