using Photon.Pun; using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.AI; using UnityEngine.Animations.Rigging; using UnityEngine.UI; using static UnityEngine.Rendering.DebugUI; public class PlayerController : MonoBehaviourPunCallbacks { public CharacterController controller; InventoryManager inventoryManager; public PlayerNetwork playerNetwork; public Animator anim; public RuntimeAnimatorController defaultController; private Transform cam; public Transform camFollowTarget; [Header("Movement")] public float speed = 6f; public bool isGrounded => !anim.GetBool("jumping"); public float sprintingMultiplier = 1.5f; public float stamina; public float maxStamina = 15; public float staminaRechargeRate = 2; public bool jumped; public float jumpSpeed = 10f; public GameObject umbrella; float turnSmoothVelocity; public float turnSmoothTime = 0.1f; //public GameObject blobShadow; [HideInInspector] public Vector3 moveDirection; public Vector3 movingVector; public Vector3 crouchCamOffset; [Header("Shooting")] public float fireRate = 0.1f; public bool aiming; public float aimedFOV = 20; public float normalFOV = 50; public bool shooting; public float aimingSpeedMultiplier = 0.5f; public Transform aimSpine; public MeleeListener meleeListener; [SerializeField] private int m_activeWeaponSlot = -1; /// /// Active Weapon in hand /// -1 = nothin /// 0 = primary /// 1 = secondary /// 2 = handgun /// 3 = throwable /// public int activeWeaponSlot { get { return m_activeWeaponSlot; } set { m_activeWeaponSlot = value; UIManager.SetWeaponSlot(value); if (value >= 0) { playerNetwork.SetActiveWeapon(WeaponTypeInHand); UpdateShootingData(WeaponTypeInHand); } else { playerNetwork.SetActiveWeapon(null); } } } public Rig RifleRig; public Transform leftHandIK, m_leftHandIK; public Rig AimRig; public Transform lookAtTarget; [Header("Throwables")] public float throwingSpeed; public float throwingSpeedMin, throwingSpeedMax; public Transform throwableSpawnPoint; public LineRenderer NadeTrajectoryRenderer; public float NadeTrajectoryResolution = 0.5f; public float NadeTrajectoryLength = 250; Transform _lookAtTarget; // -------------------------------------------------------------- VARS END ------------------------------------------------------------------- void Awake() { inventoryManager = GetComponent(); playerNetwork = GetComponent(); } private void OnValidate() { //Auto assign if (anim == null) anim = GetComponent(); if (controller == null) controller = GetComponent(); if(meleeListener == null) meleeListener = GetComponentInChildren(); } PlayerFX effects; void Start() { if (!photonView.IsMine) { Destroy(this); return; } _lookAtTarget = Camera.main.transform.GetChild(0); CameraFollow.instance.target = camFollowTarget; GameManager.localPlayer = this; Application.targetFrameRate = 60; cam = Camera.main.transform; effects = GetComponent(); // SetupCameras(); Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; stamina = maxStamina; Debug.Log(GameManager.desiredGameMode); //Setup Gamemode if (GameManager.desiredGameMode == GameModes.Deathmatch.ToString() || GameManager.desiredGameMode == GameModes.TeamDeathmatch.ToString()) { Debug.Log("Preparing Deathmatch"); InventoryManager.instance.GiveDefaultLoots(GameManager.instance.DeathmatchDefaultInventory); } SettingsManager.instance.OnSettingsChanged.AddListener(OnSettingsChanged); } float movingSpeedMultiplier = 1; void OnSettingsChanged() { movingSpeedMultiplier = SettingsManager.instance.moveSpeedSlider.value; } public bool reloading => anim.GetCurrentAnimatorClipInfo(1)[0].clip.name == "Reloading"; bool overShoulder = false; bool weaponInHand => activeWeaponSlot == 0 ? (inventoryManager.FirstWeapon != null) : (activeWeaponSlot == 1 ? inventoryManager.SecondWeapon != null : (activeWeaponSlot == 2 ? inventoryManager.PrimaryWeapon != null : false)); // Update is called once per frame bool throwInit = false; void OnMouse0() { if(activeWeaponSlot >-1 && WeaponTypeInHand==null){return;} if (WeaponTypeInHand != null && WeaponTypeInHand.isThrowable) { ToggleNadeTrajectory(true); throwInit = true; anim.SetBool("throw_start", true); anim.SetBool("throw_end", false); return; } shooting = true; if (!aiming) { aimToggle(true); } } public bool isActive = true; void HandleInput() { if(Input.mouseScrollDelta.y >0){ if(activeWeaponSlot >= 0){ SetActiveWeapon(activeWeaponSlot-1); }else{ SetActiveWeapon(3); } }else if(Input.mouseScrollDelta.y <0){ if(activeWeaponSlot < 3){ SetActiveWeapon(activeWeaponSlot+1); }else{ SetActiveWeapon(-1); } } if (Input.GetMouseButtonDown(1)) { overShoulder = true; aimToggle(true); } if (Input.GetMouseButtonUp(1)) { overShoulder = false; aimToggle(false); } if (Input.GetMouseButtonDown(0)) { OnMouse0(); } if (Input.GetMouseButtonUp(0)) { if (throwInit && WeaponTypeInHand.isThrowable) { anim.SetBool("throw_start", false); anim.SetBool("throw_end", true); ToggleNadeTrajectory(false); StartCoroutine(CoroutineThrowNade()); } shooting = false; if (!Input.GetMouseButton(1)) { aimToggle(false); } throwInit = false; readyToShoot = 2f; } #region INPUTS if (Input.GetKeyDown(KeyCode.C)) { toggleCrouch(); } if (Input.GetKeyDown(KeyCode.Space)) { jump(); } if (Input.GetKeyDown(KeyCode.R)) { reload(); } if (Input.GetKeyDown(KeyCode.G)) { if (inventoryManager.EquippedThrowable != null) { if (activeWeaponSlot == 3) { inventoryManager.CycleThrowable(); } activeWeaponSlot = 3; UpdateWeapon(); } } // if(Input.GetKeyDown(KeyCode.G)){ // if(inventoryManager.EquippedThrowable != null){ // ToggleNadeTrajectory(true); // } // } // if (Input.GetKeyUp(KeyCode.G)) // { // ToggleNadeTrajectory(false); // throwNade(); // } if (Input.GetKeyDown(KeyCode.LeftShift)) { sprinting = true; } if (Input.GetKeyUp(KeyCode.LeftShift)) { sprinting = false; } if (Input.GetKeyDown(KeyCode.X)) { SetActiveWeapon(-1); } if (Input.GetKeyDown(KeyCode.Alpha1)) { SetActiveWeapon(0); } if (Input.GetKeyDown(KeyCode.Alpha2)) { SetActiveWeapon(1); } if (Input.GetKeyDown(KeyCode.Alpha3)) { SetActiveWeapon(2); } // if(Input.GetKeyDown(KeyCode.Alpha4)){ // inventoryManager.CycleThrowable(); // UpdateWeapon(); // } #endregion } public void SetActiveWeapon(int val){ activeWeaponSlot = val; UpdateWeapon(); AutoReload(); } void Update() { if (!isActive) { return; } if (!UIManager.isPaused) { HandleInput(); } CameraFollow.instance.isAiming = (overShoulder && weaponInHand && (isGrounded || airTime > airTimeForAim)); lookAtTarget.position = Camera.main.transform.position + (Camera.main.transform.forward * 1000); leftHandIK.SetLocalPositionAndRotation(m_leftHandIK.localPosition, m_leftHandIK.localRotation); if (NadeTrajectoryRenderer.enabled) { UpdateNadeTrajectory(); } shoot(); UpdateAnim(); UIManager.SetStamina(stamina, maxStamina); if(punchCooldown >0){ punchCooldown -= Time.deltaTime; } } private void FixedUpdate() { if (!isActive) { return; } move(); } void UpdateShootingData(LootItemScriptableObject data) { if (data == null) { return; } fireRate = data.fireRate; } public void OnHit(float damage) { } public void OnJumpBoost(float boost) { if (photonView.IsMine) { moveDirection.y += boost; } } // -------------------------------------------------------------- NADES ------------------------------------------------------------------- void ToggleNadeTrajectory(bool val) { NadeTrajectoryRenderer.enabled = val; if (val) { throwingSpeed = throwingSpeedMin; } } void UpdateNadeTrajectory() { if (throwingSpeed < throwingSpeedMax) { throwingSpeed += Time.deltaTime * 1.5f; } int i = 0; NadeTrajectoryRenderer.positionCount = Mathf.CeilToInt(NadeTrajectoryLength / NadeTrajectoryResolution); Vector3 startPosition = throwableSpawnPoint.position; Vector3 startVelocity = ThrowableStartVelocity; NadeTrajectoryRenderer.SetPosition(i, startPosition); for (float time = 0; time < NadeTrajectoryLength; time += NadeTrajectoryResolution) { if (i >= NadeTrajectoryRenderer.positionCount - 1) { break; } i++; Vector3 point = startPosition + time * startVelocity; point.y = startPosition.y + startVelocity.y * time + (Physics.gravity.y / 2f * time * time); NadeTrajectoryRenderer.SetPosition(i, point); Vector3 lastPoint = NadeTrajectoryRenderer.GetPosition(i - 1); if (Physics.Linecast(lastPoint, point)) { NadeTrajectoryRenderer.positionCount = i; break; } } } Vector3 ThrowableStartVelocity => Camera.main.transform.forward * throwingSpeed + new Vector3(0, throwingSpeed / 2f, 0); void throwNade() { if (inventoryManager.EquippedThrowable == null) { return; } if (inventoryManager.Stock.GetValueOrDefault(inventoryManager.EquippedThrowable, 0) <= 0) { return; } StartCoroutine(CoroutineThrowNade()); playerNetwork.OnNadeThrow(); } bool throwing = false; IEnumerator CoroutineThrowNade() { throwing = true; int m_activeWeaponSlot = activeWeaponSlot; activeWeaponSlot = -1; UpdateWeapon(); anim.SetTrigger("Throw"); yield return new WaitForSeconds(0.2f); GameObject nade = PhotonNetwork.Instantiate(inventoryManager.EquippedThrowable.spawnableName, throwableSpawnPoint.position, Quaternion.identity); Destroy(nade.GetComponent()); nade.GetComponent().velocity = ThrowableStartVelocity; GetComponent().StartBomb(photonView.ViewID, nade, inventoryManager.EquippedThrowable); inventoryManager.UseThrowable(); yield return new WaitForSeconds(0.6f); activeWeaponSlot = m_activeWeaponSlot; UpdateWeapon(); throwing = false; } // -------------------------------------------------------------- SHOOT ------------------------------------------------------------------- float st = 0; public float airTime; public float airTimeForGliding = 0.7f; public float airTimeForAim = 1; void shoot() { st += Time.deltaTime; if (shooting && !jumped) { if (st > fireRate) { st = 0; FireShot(); if (!WeaponTypeInHand.isAutomatic) { shooting = false; } } } if (aiming) { Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2f, Screen.height / 2f)); RaycastHit hit = new RaycastHit(); string enemyName = ""; if (Physics.Raycast(ray, out hit)) { if (hit.collider.tag == "Player") { HitBox hitbox = hit.collider.GetComponent(); if (hitbox != null) { enemyName = hitbox.player.username == "" ? "Dev0" : hitbox.player.username; } } } UIManager.instance.EnemyPopupText.text = enemyName; } else { UIManager.instance.EnemyPopupText.text = ""; } } public float recoil = 0.05f; float readyToShoot = 2; void FireShot() { if(activeWeaponSlot == -1){ //PUNCH Punch(); return; } if (inventoryManager.loadedRounds1 <= 0 && activeWeaponSlot == 0) { Debug.Log("Reload to shoot"); AutoReload(); return; }// Abort if no rounds in weapon 1 if (inventoryManager.loadedRounds2 <= 0 && activeWeaponSlot == 1) { Debug.Log("Reload to shoot"); AutoReload(); return; }// Abort ifn no rounds in weapon 2 if (inventoryManager.loadedRoundsPrimary <= 0 && activeWeaponSlot == 2) { Debug.Log("Reload to shoot"); AutoReload(); return; } // Abort ifn no rounds in pitsol StartCoroutine(CoroutineFireShot()); } float punchCooldown =0; void Punch(){ if(punchCooldown > 0){return;} // if(anim.GetCurrentAnimatorClipInfo(3).Length >0){ // if(anim.GetCurrentAnimatorClipInfo(3)[0].clip.name == "Punching"){Debug.Log("Already punching");return;} // } Debug.Log("Punch"); // anim.CrossFadeInFixedTime("Punch",0.1f); anim.SetTrigger("Punch"); photonView.RPC("RpcSetTrigger", RpcTarget.All, "Punch"); meleeListener.OnMeleeEntered = OnPunchDelivered; punchCooldown = 0.35f; } [PunRPC] void RpcSetTrigger(string triggerName){ if(!photonView.IsMine){ anim.SetTrigger(triggerName); } } void OnPunchDelivered(Collider collider){ Debug.Log("Punched " + collider.name); if(collider.GetComponent()!=null){ collider.GetComponent().OnPunched(photonView.ViewID, meleeListener.transform.position, transform); } } public LayerMask shootingLayerMask; IEnumerator CoroutineFireShot() { bool aiming = anim.GetCurrentAnimatorClipInfo(1)[0].clip.name.Contains("Aiming"); if (!aiming) { Debug.Log("Not aiming"); anim.CrossFadeInFixedTime("Aiming", 0f); aimToggle(true); yield return new WaitForSeconds(0.05f); } CameraFollow.instance.y -= recoil; CameraFollow.instance.x += Random.Range(-recoil / 2f, recoil / 2f); Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2f, Screen.height / 2f)); RaycastHit hit = new RaycastHit(); if (Physics.Raycast(ray, out hit)) { effects.FireFX(hit); } else { effects.FireFX(null); } if (activeWeaponSlot == 0) { inventoryManager.loadedRounds1--; // inventoryManager.Stock[WeaponTypeInHand.ammo]--; } else if (activeWeaponSlot == 1) { inventoryManager.loadedRounds2--; // inventoryManager.Stock[WeaponTypeInHand.ammo]--; } else if (activeWeaponSlot == 2) { inventoryManager.loadedRoundsPrimary--; } UIManager.UpdateInventory(inventoryManager); } void aimToggle(bool value) { if (!weaponInHand) { return; } if (reloading) { return; } //Add the conditions aiming = value; UIManager.SetCroshair(value); UpdateAnim(); UpdateWeapon(); } bool CanReload(LootItemScriptableObject weapon, int loadedRounds) { if (loadedRounds >= weapon.roundsPerClip) { return false; } //Already loaded if (inventoryManager.getStock(weapon.ammo) <= 0) { return false; }//No ammo in inventory return true; } public void reload() { if (inventoryManager.Stock.GetValueOrDefault(WeaponTypeInHand.ammo, 0) <= 0) { Debug.Log("No ammo to reload"); return; } if (activeWeaponSlot == 0 && !CanReload(inventoryManager.FirstWeapon, inventoryManager.loadedRounds1)) { Debug.Log("No extra ammo to reload"); return; } if (activeWeaponSlot == 1 && !CanReload(inventoryManager.SecondWeapon, inventoryManager.loadedRounds2)) { Debug.Log("No extra ammo to reload"); return; } if (activeWeaponSlot == 2 && !CanReload(inventoryManager.PrimaryWeapon, inventoryManager.loadedRoundsPrimary)) { Debug.Log("No extra ammo to reload"); return; } if (reloading) { return; } StartCoroutine(toggleReload()); } IEnumerator toggleReload() { aimToggle(false); RifleRig.weight = 0; anim.SetLayerWeight(1, 1); anim.SetBool("reloading", true); yield return new WaitForSeconds(0.2f); anim.SetBool("reloading", false); while (reloading) { RifleRig.weight = 0; yield return new WaitForEndOfFrame(); } ReloadBullets(); Debug.Log(anim.GetCurrentAnimatorClipInfo(1)[0].clip.name); RifleRig.weight = 1; UpdateWeapon(); //Reload done } void AutoReload() { if (WeaponTypeInHand.ammo != null) { int roundsInHand = 0; switch (activeWeaponSlot) { case 0: roundsInHand = inventoryManager.loadedRounds1; break; case 1: roundsInHand = inventoryManager.loadedRounds2; break; case 2: roundsInHand = inventoryManager.loadedRoundsPrimary; break; } if (inventoryManager.getStock(WeaponTypeInHand.ammo) > 0 && roundsInHand <= 0) { reload(); } } } void ReloadBullets() { if (activeWeaponSlot == 0) { int emptyBullets = inventoryManager.FirstWeapon.roundsPerClip - inventoryManager.loadedRounds1; int refillingBullets = Mathf.Clamp(emptyBullets, 0, inventoryManager.Stock.GetValueOrDefault(inventoryManager.FirstWeapon.ammo, 0)); inventoryManager.loadedRounds1 += refillingBullets; inventoryManager.Stock[inventoryManager.FirstWeapon.ammo] -= refillingBullets; } else if (activeWeaponSlot == 1) { int emptyBullets = inventoryManager.SecondWeapon.roundsPerClip - inventoryManager.loadedRounds2; int refillingBullets = Mathf.Clamp(emptyBullets, 0, inventoryManager.Stock.GetValueOrDefault(inventoryManager.SecondWeapon.ammo, 0)); inventoryManager.loadedRounds2 += refillingBullets; inventoryManager.Stock[inventoryManager.SecondWeapon.ammo] -= refillingBullets; } else if (activeWeaponSlot == 2) { int emptyBullets = inventoryManager.PrimaryWeapon.roundsPerClip - inventoryManager.loadedRoundsPrimary; int refillingBullets = Mathf.Clamp(emptyBullets, 0, inventoryManager.Stock.GetValueOrDefault(inventoryManager.PrimaryWeapon.ammo, 0)); inventoryManager.loadedRoundsPrimary += refillingBullets; inventoryManager.Stock[inventoryManager.PrimaryWeapon.ammo] -= refillingBullets; } UIManager.UpdateInventory(inventoryManager); } // -------------------------------------------------------------- PICKUPS ------------------------------------------------------------------- LootItemScriptableObject WeaponTypeInHand => (activeWeaponSlot == 0) ? inventoryManager.FirstWeapon : ((activeWeaponSlot == 1) ? inventoryManager.SecondWeapon : ((activeWeaponSlot == 2) ? inventoryManager.PrimaryWeapon : (activeWeaponSlot == 3 && inventoryManager.EquippedThrowable != null ? inventoryManager.EquippedThrowable : null))); public void UpdateWeapon() { LootItemScriptableObject weaponType = WeaponTypeInHand; Debug.Log(weaponType); bool isNade = false; if (weaponType != null) { if (weaponType.isThrowable) { isNade = true; } } if (isNade) { foreach (PlayerWeaponEntry weapon in playerNetwork.weapons) { weapon.obj.SetActive(false); } foreach (LootObjectEntry nade in playerNetwork.nades) { nade.obj.SetActive(nade.data == weaponType); } anim.runtimeAnimatorController = defaultController; anim.SetLayerWeight(1, 0); RifleRig.weight = 0; return; } foreach (LootObjectEntry nade in playerNetwork.nades) { nade.obj.SetActive(false); } PlayerWeaponEntry objectEntry = playerNetwork.weapons[0]; foreach (PlayerWeaponEntry obj in playerNetwork.weapons) { obj.obj.SetActive(weaponType == obj.data); obj.muzzleFlash.SetActive(false); if (weaponType == obj.data) { objectEntry = obj; } } if (weaponType != null) { if (weaponType.overrideController == null) { anim.runtimeAnimatorController = defaultController; } else { anim.runtimeAnimatorController = weaponType.overrideController; } } m_leftHandIK.SetLocalPositionAndRotation(objectEntry.leftHandIk.localPosition, objectEntry.leftHandIk.localRotation); UpdateRigWeights(); } void UpdateRigWeights() { bool m_aiming = anim.GetCurrentAnimatorClipInfo(1)[0].clip.name.Contains("Aim"); float weight = WeaponTypeInHand == null ? 0 : 1; if (weight == 1 && WeaponTypeInHand.isThrowable) { weight = 0; } // Debug.Log(weight); anim.SetLayerWeight(1, activeWeaponSlot == 2 && !m_aiming ? 0 : weight); RifleRig.weight = activeWeaponSlot == 2 ? 0 : weight; } public void OnWeaponPickup() { StartCoroutine(pickupWeapon()); } IEnumerator pickupWeapon() { pickingLoot = true; anim.SetTrigger("Pickup"); yield return new WaitForSeconds(0.5f); // RifleGO.SetActive(true); UpdateWeapon(); if (anim.GetCurrentAnimatorClipInfoCount(2) <= 0) { Debug.Log("No pickup animation"); } else { while (anim.GetCurrentAnimatorClipInfo(2)[0].clip.name == "Pickup") { yield return new WaitForSeconds(0.1f); } } pickingLoot = false; } // -------------------------------------------------------------- MOVEMENTS ------------------------------------------------------------------- bool crouched; public void toggleCrouch() { crouched = !crouched; UpdateAnim(); } public void jump() { if (crouched) { crouched = false; return; } jumped = true; UpdateAnim(); } bool changingGun, pickingLoot; Vector3 direction; bool sprinting = false; float _speed = 0; int aimRotationOffset = 0;//50 void move() { controller.Move(moveDirection * Time.deltaTime); if (!controller.isGrounded) { moveDirection.y -= 9.8f * Time.deltaTime; if (airTime > airTimeForGliding) { moveDirection.y = -3f; if (activeWeaponSlot >= 0) { activeWeaponSlot = -1; UpdateWeapon(); } } anim.SetFloat("Gliding", airTime > airTimeForGliding ? 1 : 0); aimToggle(false); } umbrella.SetActive(airTime > airTimeForGliding); if (jumped) { if (controller.isGrounded) { moveDirection.y = -1f; #region obsolete /*if (sensingObject != null && sensingObject.tag == "Wall") { controller.enabled = false; anim.CrossFadeInFixedTime("WallClimb", 0.1f); cineCam.LookAt = rootMotionCamFollow; cineCam.Follow = rootMotionCamFollow; transform.position = PlayerControllerHelper.playerPositionNearWall(sensingObject, transform.position, 0.2f) + new Vector3(0, heightDiffer);//+ new Vector3(0, 1.5f, 0) transform.eulerAngles = PlayerControllerHelper.getWallRotation(sensingObject, transform.position); // Debug.Log(transform.eulerAngles); } else { moveDirection.y = jumpSpeed; }*/ #endregion moveDirection.y = jumpSpeed; } jumped = false; } bool slowdown = (aiming || shooting || reloading || changingGun || crouched || pickingLoot); bool speedup = (sprinting && !aiming); bool m_aiming = anim.GetCurrentAnimatorClipInfo(1)[0].clip.name.Contains("Aim"); // float horizontal = 0; float vertical = 0; horizontal = Input.GetAxis("Horizontal"); vertical = Input.GetAxis("Vertical"); if (vertical < 1 || horizontal != 0) { speedup = false; } anim.SetFloat("move_x", horizontal); anim.SetFloat("move_y", vertical); direction = new Vector3(horizontal, 0f, vertical); if (direction.magnitude > 1) { direction = direction.normalized; } if (controller.isGrounded) { airTime = 0; if (anim.GetCurrentAnimatorStateInfo(0).IsName("fallToLand")) { return; } if (aiming) { anim.SetFloat("Horizontal", horizontal); anim.SetFloat("Vertical", vertical); } else { anim.SetFloat("Horizontal", 0); anim.SetFloat("Vertical", 1); } if (direction.magnitude >= 0.1f) { if (stamina > 0 && speedup) { stamina -= Time.deltaTime; } else if (!speedup) { RechargeStamina(); } // float targetAngle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg + cam.eulerAngles.y; float targetAngle = cam.eulerAngles.y; float angle = Mathf.SmoothDampAngle(transform.eulerAngles.y, targetAngle, ref turnSmoothVelocity, turnSmoothTime); if (aiming && !crouched) { angle = cam.eulerAngles.y + aimRotationOffset; } transform.rotation = Quaternion.Euler(0f, angle, 0f); // Vector3 moveDir = Quaternion.Euler(0f, targetAngle, 0f) * Vector3.forward; Vector3 moveDir = transform.forward * vertical + transform.right * horizontal; float m_speed = speed * movingSpeedMultiplier * (slowdown ? aimingSpeedMultiplier : 1) * (speedup && stamina > 0 ? sprintingMultiplier : 1); if (pickingLoot || throwing) { m_speed = 0; } _speed = Mathf.Lerp(_speed, m_speed, 0.1f); movingVector = moveDir.normalized * ((direction.magnitude < 0.3f) ? 0.3f : direction.magnitude) * _speed * Time.deltaTime; anim.SetBool("moving", true); // Debug.Log("Moving Vector : " + movingVector);\ float curMovingSpeed = new Vector3(movingVector.x, 0, movingVector.z).magnitude / movingSpeedMultiplier; anim.SetFloat("movingSpeed", curMovingSpeed); CameraFollow.instance.currentTargetSpeed = aiming ? 0 : curMovingSpeed; } else { RechargeStamina(); if (true) //climbing wall { float targetAngle = cam.eulerAngles.y; float angle = Mathf.SmoothDampAngle(transform.eulerAngles.y, targetAngle, ref turnSmoothVelocity, turnSmoothTime * 5); Vector3 prevRot = transform.eulerAngles; if (m_aiming && !crouched) { angle = cam.eulerAngles.y + aimRotationOffset; } transform.rotation = Quaternion.Euler(0, angle, 0); movingVector = Vector3.zero; anim.SetBool("moving", false); anim.SetFloat("rotatingSpeed", Mathf.Lerp(anim.GetFloat("rotatingSpeed"), Mathf.Clamp((transform.eulerAngles.y - prevRot.y) / 1f, -0.9f, 0.9f), 1f)); } } anim.SetBool("jumping", false); } else { airTime += Time.deltaTime; float targetAngle = cam.eulerAngles.y; float angle = Mathf.SmoothDampAngle(transform.eulerAngles.y, targetAngle, ref turnSmoothVelocity, turnSmoothTime * 5); if (m_aiming) { angle = cam.eulerAngles.y; } transform.rotation = Quaternion.Euler(0, angle, 0); anim.SetBool("jumping", true); Vector3 moveDir = transform.forward * vertical + transform.right * horizontal; movingVector = moveDir.normalized * ((direction.magnitude < 0.3f) ? 0.3f : direction.magnitude) * _speed * Time.deltaTime; } controller.Move(movingVector); } void RechargeStamina() { if (stamina < maxStamina) { stamina += Time.deltaTime * staminaRechargeRate; } } public void UpdateAnim() { anim.SetBool("aiming", aiming); anim.SetBool("crouched", crouched); bool m_aiming = anim.GetCurrentAnimatorClipInfo(1)[0].clip.name.Contains("Aim"); AimRig.weight = m_aiming ? 1 : 0; UpdateRigWeights(); } public void OnDeath() { isActive = false; activeWeaponSlot = -1; UpdateWeapon(); } }