Пример #1
0
    private void SpawnSnowball()
    {
        // GameObject
        GameObject snowball = Instantiate(
            mProjectile,
            mHandToThrowFrom.transform.position,
            Quaternion.identity,
            mProjectileParent);

        mCurrentSnowball = snowball.GetComponent <Player_SnowballBehavior>();
        mCurrentSnowball.SetThrowJoint(mHandToThrowFrom);
    }
Пример #2
0
    private void Update()
    {
        // Charging
        if (mPlayerMovement.GetState() == PlayerMovement.State.Locomotion)
        {
            // Resetting target before checking for new ones
            if (mChargeTimer == 0)
            {
                mTarget = null;
            }

            if (!mPlayerMovement.GetImmobile())
            {
                if (mInputManager.GetTriggers().y != 0.0f)
                {
                    // Charge timer
                    if (mChargeTimer == 0)
                    {
                        // Animation and movement
                        mAnimationController.Animation_IsStartingToShoot();
                        mPlayerMovement.SetMovementSpeedMax(mMovementSpeedAiming);

                        if (mCurrentSnowball != null)
                        {
                            mCurrentSnowball.transform.GetChild(1).GetComponent <MeshRenderer>().materials[0].SetFloat("_OpacityMask", 0f);
                            mCurrentSnowball.transform.GetChild(1).GetChild(0).GetComponent <MeshRenderer>().materials[0].SetFloat("_OpacityMask", 0f);
                            mCurrentSnowball.transform.GetChild(1).GetChild(1).GetComponent <MeshRenderer>().materials[0].SetFloat("_OpacityMask", 0f);

                            mCurrentSnowball.transform.GetChild(1).GetComponent <MeshRenderer>().materials[0].SetColor("_ReadyColor", Color.blue);
                            mCurrentSnowball.transform.GetChild(1).GetChild(0).GetComponent <MeshRenderer>().materials[0].SetColor("_ReadyColor", Color.blue);
                            mCurrentSnowball.transform.GetChild(1).GetChild(1).GetComponent <MeshRenderer>().materials[0].SetColor("_ReadyColor", Color.blue);
                        }
                        mChargeTimer += Time.deltaTime;
                    }

                    if (mChargeTimer < mChargeMax)
                    {
                        mChargeTimer += Time.deltaTime;

                        if (mCurrentSnowball != null && (mChargeTimer / mChargeDuration) < 1f)
                        {
                            if (!mCurrentSnowball.transform.GetChild(1).gameObject.activeSelf)
                            {
                                mCurrentSnowball.transform.GetChild(1).gameObject.SetActive(true);
                            }

                            mCurrentSnowball.transform.GetChild(1).GetComponent <MeshRenderer>().materials[0].SetFloat("_OpacityMask", (mChargeTimer / mChargeDuration));
                            mCurrentSnowball.transform.GetChild(1).GetChild(0).GetComponent <MeshRenderer>().materials[0].SetFloat("_OpacityMask", (mChargeTimer / mChargeDuration));
                            mCurrentSnowball.transform.GetChild(1).GetChild(1).GetComponent <MeshRenderer>().materials[0].SetFloat("_OpacityMask", (mChargeTimer / mChargeDuration));
                        }

                        if (mCurrentSnowball != null && (mChargeTimer / mChargeDuration) >= 1f && !mCurrentSnowball.transform.GetChild(2).gameObject.activeSelf)
                        {
                            mCurrentSnowball.transform.GetChild(1).GetComponent <MeshRenderer>().materials[0].SetFloat("_ReadyStrenght", 0.5f);
                            mCurrentSnowball.transform.GetChild(2).gameObject.SetActive(true);
                            transform.GetChild(0).GetComponent <AudioAvatar>().Play_snowballThrowChargeReadyCue();
                        }
                    }

                    // Enabling snowball
                    if (mCurrentSnowball == null)
                    {
                        SpawnSnowball();
                    }

                    // Enabling reticle
                    if (!mTargetIndicator.activeSelf)
                    {
                        mTargetIndicator.SetActive(true);
                    }

                    // Getting nearby enemies
                    GetNearbyEnemies(mTargetDistanceFar);

                    // Selecting target
                    float ruler = mTargetDistanceFar * mTargetDistanceFar;
                    foreach (KeyValuePair <Transform, Vector3> kvp in mTargetDictionary)
                    {
                        float sqrMag = kvp.Value.sqrMagnitude;
                        if (sqrMag < ruler && Vector3.Dot(kvp.Key.position - transform.position, Camera.main.transform.forward) > 0f)
                        {
                            ruler   = sqrMag;
                            mTarget = kvp.Key;
                        }
                    }

                    // Removing target if you walk away after having targeted enemy
                    if ((mTarget.transform.position - transform.position).magnitude >= mTargetDistanceFar)
                    {
                        mTarget = null;
                    }

                    // Target indicator
                    if (mTarget != null)
                    {
                        mTargetIndicator.SetActive(true);
                        mTargetIndicator.transform.position = mTarget.transform.position + mTargetIndicatorOffset;
                        mTargetIndicator.transform.rotation = Quaternion.LookRotation(Camera.main.transform.position - mTargetIndicator.transform.position);
                    }
                    else
                    {
                        mTargetIndicator.SetActive(true);

                        Ray ray = new Ray(transform.position + transform.forward * mTargetDistanceFar + Vector3.up * 6f, Vector3.down);

                        RaycastHit hit;

                        if (Physics.Raycast(ray, out hit, 12f))
                        {
                            mTargetIndicator.transform.position = hit.point;

                            mTargetIndicator.transform.forward = hit.normal;
                        }
                    }
                }
                // Throwing
                else
                {
                    if (mCurrentSnowball != null)
                    {
                        mCurrentSnowball.transform.GetChild(1).GetComponent <MeshRenderer>().materials[0].SetColor("_ReadyColor", Color.white);
                        mCurrentSnowball.transform.GetChild(1).GetComponent <MeshRenderer>().materials[0].SetFloat("_ReadyStrenght", 0f);
                        mCurrentSnowball.transform.GetChild(1).GetChild(0).GetComponent <MeshRenderer>().materials[0].SetFloat("_ReadyStrenght", 0f);
                        mCurrentSnowball.transform.GetChild(1).GetChild(1).GetComponent <MeshRenderer>().materials[0].SetFloat("_ReadyStrenght", 0f);
                    }
                    // Resetting reticle
                    if (mTargetIndicator.activeSelf)
                    {
                        mTargetIndicator.SetActive(false);
                    }

                    // Resetting movement speed
                    mPlayerMovement.SetMovementSpeedMax(mMovementSpeedInitial);

                    // If elgible to throw...
                    if (mChargeTimer >= mChargeDuration)
                    {
                        // Debug
                        if (mDebug)
                        {
                            print("BUTTON RELEASE: \t RT");
                        }
                        //SpawnSnowball();
                        if (mTarget != null)
                        {
                            mAnimationController.Animation_ThrowSnowball();
                            mCurrentSnowball.SetTargetPositionAndChangeState(mTarget.position);
                        }
                        else
                        {
                            mAnimationController.Animation_ThrowSnowball();
                            mCurrentSnowball.SetTargetPositionAndChangeState(transform.position + transform.forward * mTargetDistanceFar);
                        }

                        // Resetting variables
                        mChargeTimer     = 0f;
                        mCurrentSnowball = null;

                        // Debug
                        if (mDebug)
                        {
                            print("Aimed Throw!");
                            mTargetDictionary.Clear();
                            mTargetDictionaryCopy.Clear();
                        }
                    }
                    // Else abort charge
                    else if (mChargeTimer > 0f)
                    {
                        mAnimationController.Animation_CancelShooting();
                        mTargetIndicator.SetActive(false);
                        if (mCurrentSnowball != null)
                        {
                            mCurrentSnowball.transform.GetChild(1).gameObject.SetActive(false);
                        }
                        transform.GetChild(0).GetComponent <AudioAvatar>().Play_snowballNotReady();
                        mCurrentSnowball.DropSnowball();
                        mCurrentSnowball = null;
                        mChargeTimer     = 0f;
                        mPlayerMovement.SetMovementSpeedInfluence(0f, 0f, false);
                    }
                }
            }
        }
        // If not in Locomotion state
        else
        {
            // Despawn snowball
            if (mCurrentSnowball != null)
            {
                Destroy(mCurrentSnowball.gameObject);
            }
            mChargeTimer = 0f;
        }

        // Debugging
        VisualDebug();
    }