220 lines
7.4 KiB
C#
220 lines
7.4 KiB
C#
|
using UnityEngine;
|
|||
|
|
|||
|
public class PlayerMovement : MonoBehaviour
|
|||
|
{
|
|||
|
[Header("Movement Settings")]
|
|||
|
public float mouseSensitivity = 2.0f;
|
|||
|
|
|||
|
[Header("Movement Speeds")]
|
|||
|
public float walkSpeed = 1.4f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
public float runSpeed = 2.5f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
public float crouchSpeed = 1.1f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
private float current_speed;
|
|||
|
|
|||
|
[Header("Camera Settings")]
|
|||
|
public Camera playerCamera; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> Inspector
|
|||
|
|
|||
|
[Header("Head Bobbing Settings")]
|
|||
|
public float bobFrequency = 1.5f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
public float bobHorizontalAmplitude = 0.1f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
public float bobVerticalAmplitude = 0.1f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
public Vector3 originalCameraPosition;
|
|||
|
private float bobTimer = 1f;
|
|||
|
|
|||
|
[Header("Acceleration Settings")]
|
|||
|
public float acceleration = 14f;
|
|||
|
public float deceleration = 10f;
|
|||
|
|
|||
|
private Vector3 currentVelocity = Vector3.zero;
|
|||
|
|
|||
|
[Header("Jump Settings")]
|
|||
|
public float jumpHeight = 1.52f;
|
|||
|
public float gravity = -30f;
|
|||
|
|
|||
|
private float verticalVelocity = 0f;
|
|||
|
|
|||
|
[Header("Crouch Settings")]
|
|||
|
public float crouchHeight = 1f;
|
|||
|
public float standingHeight = 2f;
|
|||
|
private bool isCrouching = false;
|
|||
|
|
|||
|
private CharacterController controller;
|
|||
|
private float rotationX = 0f;
|
|||
|
private float rotationY = 0f;
|
|||
|
|
|||
|
[Header("Camera Shake Settings")]
|
|||
|
public float shakeIntensity = 1f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
public float shakeFrequency = 2.0f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
public float restShakeFrequency = 0.5f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
public float restShakeIntensity = 0.5f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
void Start()
|
|||
|
{
|
|||
|
controller = GetComponent<CharacterController>();
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
Cursor.visible = false;
|
|||
|
Cursor.lockState = CursorLockMode.Locked;
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if (playerCamera == null)
|
|||
|
{
|
|||
|
playerCamera = GetComponentInChildren<Camera>();
|
|||
|
}
|
|||
|
|
|||
|
if (playerCamera == null)
|
|||
|
{
|
|||
|
Debug.LogError("PlayerMovement: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.");
|
|||
|
}
|
|||
|
|
|||
|
originalCameraPosition = playerCamera.transform.localPosition; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
|
|||
|
void Update()
|
|||
|
{
|
|||
|
if (playerCamera == null)
|
|||
|
{
|
|||
|
Debug.LogWarning("PlayerMovement: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// === <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ===
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity;
|
|||
|
float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity;
|
|||
|
|
|||
|
rotationY += mouseX;
|
|||
|
rotationX -= mouseY;
|
|||
|
rotationX = Mathf.Clamp(rotationX, -90f, 90f);
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
playerCamera.transform.localRotation = Quaternion.Euler(rotationX, 0f, 0f);
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> Y
|
|||
|
transform.rotation = Quaternion.Euler(0f, rotationY, 0f);
|
|||
|
|
|||
|
// === <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ===
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if (Input.GetKeyDown(KeyCode.LeftControl))
|
|||
|
{
|
|||
|
Crouch();
|
|||
|
}
|
|||
|
else if (Input.GetKeyUp(KeyCode.LeftControl))
|
|||
|
{
|
|||
|
StandUp();
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
float moveHorizontal = Input.GetAxis("Horizontal");
|
|||
|
float moveVertical = Input.GetAxis("Vertical");
|
|||
|
bool isMoving = moveHorizontal != 0 || moveVertical != 0;
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
float targetSpeed = walkSpeed;
|
|||
|
|
|||
|
if (Input.GetKey(KeyCode.LeftShift) && !isCrouching)
|
|||
|
{
|
|||
|
targetSpeed = runSpeed;
|
|||
|
}
|
|||
|
|
|||
|
if (isCrouching)
|
|||
|
{
|
|||
|
targetSpeed = crouchSpeed;
|
|||
|
}
|
|||
|
|
|||
|
Vector3 moveDirection = transform.right * moveHorizontal + transform.forward * moveVertical;
|
|||
|
Vector3 desiredVelocity = moveDirection.normalized * targetSpeed;
|
|||
|
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if (isMoving)
|
|||
|
{
|
|||
|
currentVelocity = Vector3.MoveTowards(currentVelocity, desiredVelocity, acceleration * Time.deltaTime);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
currentVelocity = Vector3.MoveTowards(currentVelocity, Vector3.zero, deceleration * Time.deltaTime);
|
|||
|
}
|
|||
|
|
|||
|
// === <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ===
|
|||
|
|
|||
|
if (controller.isGrounded)
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if (verticalVelocity < 0)
|
|||
|
{
|
|||
|
verticalVelocity = -2f;
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if (Input.GetButtonDown("Jump") && !isCrouching)
|
|||
|
{
|
|||
|
verticalVelocity = Mathf.Sqrt(jumpHeight * -2f * gravity);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
verticalVelocity += gravity * Time.deltaTime;
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
Vector3 move = currentVelocity;
|
|||
|
move.y = verticalVelocity;
|
|||
|
float bobOffsetY = 0.9f;
|
|||
|
float bobOffsetX = 0f;
|
|||
|
controller.Move(move * Time.deltaTime);
|
|||
|
|
|||
|
// if (controller.isGrounded && !isMoving) //<2F><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// {
|
|||
|
// bobOffsetY = Mathf.Sin(Time.time * restShakeFrequency) * restShakeIntensity * 0.5f;
|
|||
|
// bobOffsetX = Mathf.Cos(Time.time * restShakeFrequency * 0.2f) * restShakeIntensity * 0.1f;
|
|||
|
// playerCamera.transform.localPosition = originalCameraPosition + new Vector3(bobOffsetX, bobOffsetX, 0f);
|
|||
|
|
|||
|
// // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// float shakeRotationX = Mathf.Sin(Time.time * shakeFrequency * 0.08f) * shakeIntensity;
|
|||
|
// float shakeRotationY = Mathf.Cos(Time.time * shakeFrequency * 0.2f) * shakeIntensity * 3;
|
|||
|
|
|||
|
// playerCamera.transform.localRotation *= Quaternion.Euler(shakeRotationX, 0f, shakeRotationY); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
// }
|
|||
|
|
|||
|
|
|||
|
// // === <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ===
|
|||
|
// if (controller.isGrounded && isMoving)
|
|||
|
// {
|
|||
|
// bobTimer += Time.deltaTime * 0.1f * targetSpeed;
|
|||
|
// bobOffsetY = Mathf.Sin(bobTimer * 0.2f) * bobVerticalAmplitude;
|
|||
|
// bobOffsetX = Mathf.Cos(bobTimer * 0.5f) * Mathf.Cos(Time.time * restShakeFrequency * 0.2f) * restShakeIntensity * 0.1f; ;
|
|||
|
|
|||
|
// playerCamera.transform.localPosition = originalCameraPosition + new Vector3(bobOffsetX, bobOffsetY, 0f);
|
|||
|
|
|||
|
// // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// float shakeRotationX = Mathf.Sin(Time.time * shakeFrequency * 0.5f) * shakeIntensity * targetSpeed;
|
|||
|
// float shakeRotationY = Mathf.Cos(Time.time * shakeFrequency) * shakeIntensity * targetSpeed / 3;
|
|||
|
|
|||
|
// playerCamera.transform.localRotation *= Quaternion.Euler(shakeRotationX, 0f, shakeRotationY); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// }
|
|||
|
// else
|
|||
|
// {
|
|||
|
// // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// bobTimer = 0.1f;
|
|||
|
// playerCamera.transform.localPosition = Vector3.Lerp(playerCamera.transform.localPosition, originalCameraPosition, Time.deltaTime * 1f);
|
|||
|
// }
|
|||
|
}
|
|||
|
|
|||
|
void Crouch()
|
|||
|
{
|
|||
|
controller.height = crouchHeight;
|
|||
|
isCrouching = true;
|
|||
|
}
|
|||
|
|
|||
|
void StandUp()
|
|||
|
{
|
|||
|
controller.height = standingHeight;
|
|||
|
isCrouching = false;
|
|||
|
}
|
|||
|
}
|