void Update() { if (controller == null) { controller = GetComponentInChildren <CharacterController>(); } doNextFrame?.Invoke(); doNextFrame = null; if (animator == null) { animator = GetComponentInChildren <Animator>(); } //transform.rotation = Quaternion.Euler(0, yaw, 0); //head.localRotation = Quaternion.Euler(pitch, 0, 0); if (velocity.y > 0 && (controller.collisionFlags & CollisionFlags.Above) != 0) { velocity.y = 0; } CheckForSnapToGround(); UpdateDroneStuff(); Vector3 moveInput = moveInputFunc?.Invoke() ?? Vector3.zero; Vector3 aimInput = aimInputFunc?.Invoke() ?? Vector3.zero; TKeys keyInput = keysInputFunc?.Invoke() ?? TKeys.None; if (moveInput.sqrMagnitude > 1) { moveInput = moveInput.normalized; } Vector3 newMoveDir = moveInput; if (moveRoot != null && moveInput.sqrMagnitude > 0.0f) { Quaternion q = moveRoot.rotation; Vector3 qe = q.eulerAngles; q = Quaternion.Euler(0, qe.y, 0); Vector3 forward = moveRoot.forward; forward.y = 0; forward.Normalize(); Vector3 right = moveRoot.right; right.y = 0; right.Normalize(); newMoveDir = forward * moveInput.z + right * moveInput.x; //forward = transform.forward; forward.y = 0; forward.Normalize(); //right = transform.right; right.y = 0; right.Normalize(); //forward = Vector3.Project(forward, moveDir); //right = Vector3.Project(right, moveDir); //moveDir = forward + right * sideSpeedRatio; } float moveRate = 1.0f; if (moveInput.sqrMagnitude > tapThreshold) { lastMoveDir = moveInput; lastMoveTime = 0; } else { lastMoveTime += Time.deltaTime; } if (keyInput.Has(TKeys.Sprint)) { moveRate *= sprintPower; } moveDir = Vector3.Lerp(moveDir, newMoveDir, Time.deltaTime * (moveRate * responseBase / mass)); if (Mathf.Abs(newMoveDir.x) > 0 || Mathf.Abs(newMoveDir.z) > 0) { Vector3 target = new Vector3(newMoveDir.x, 0, newMoveDir.z); //float target = Mathf.Sign(moveInput.x); Vector3 fwd = transform.forward; fwd = Vector3.Slerp(fwd, target, Time.deltaTime * lookDampening); Debug.DrawLine(transform.position, transform.position + fwd * 4); } RagCam rcam = moveRoot.GetComponent <RagCam>(); if (rcam) { rcam.camHardPush = rcam.mousePushCamera ? Vector3.zero : aimInput; } if (aimInput.sqrMagnitude > 0) { Vector3 targetPos = transform.position + aimInput; targetPos.y = transform.position.y; Quaternion prevRotation = transform.rotation; transform.LookAt(targetPos, Vector3.up); transform.rotation = Quaternion.Lerp(prevRotation, transform.rotation, Time.deltaTime * animResponse); } Vector3 targetMoveXYZ = new Vector3(Vector3.Dot(moveDir, transform.right), 0, Vector3.Dot(moveDir, transform.forward)); animMoveXYZ = Vector3.Lerp(animMoveXYZ, targetMoveXYZ, Time.deltaTime * animResponse); aniData.Record("MoveX", animMoveXYZ.x); aniData.Record("MoveZ", animMoveXYZ.z); aniData.Record("MoveAnimSpeed", 2.2f - .4f * moveDir.magnitude); bool fire = keyInput.Has(TKeys.Fire); aniData.Record("Fire", fire); if (muzzleflash != null) { if (guides.Length > 0) { muzzleflash.transform.position = guides[0].position; muzzleflash.transform.LookAt(guides[0].position + guides[0].forward, Vector3.up); } if (fire) { muzzleflash.gameObject.BroadcastMessage("Play", SendMessageOptions.DontRequireReceiver); } } aniData.Record("Crouch", keyInput.Has(TKeys.Crouch)); aniData.Record("Reload", false); aniData.Record("Throw", keyInput.Has(TKeys.Throw)); if (keyInput.Pressed(TKeys.Use, lastKeys)) { if (false) { //Use(trackedUsable); } else { aniData.Record("Reload", keyInput.Has(TKeys.Use)); } } if (keyInput.Pressed(TKeys.SwitchWeapons, lastKeys)) { ChangeWeapon(currentWeaponKind == 0 ? 1 : 0); } else { aniData.Record("SwapWeapon", false); } Vector3 movement = moveDir * speed; movement += velocity; controller.CheckMoveBack(movement * Time.deltaTime); lastInput = moveInput; lastKeys = keyInput; if (animator != null && animator.enabled) { aniData.SetTo(animator); } }