diff options
Diffstat (limited to 'JamTools/Assets/JamTools/Scripts/Character/FPSCharacterController.cs')
-rw-r--r-- | JamTools/Assets/JamTools/Scripts/Character/FPSCharacterController.cs | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/JamTools/Assets/JamTools/Scripts/Character/FPSCharacterController.cs b/JamTools/Assets/JamTools/Scripts/Character/FPSCharacterController.cs new file mode 100644 index 0000000..f1dd6e2 --- /dev/null +++ b/JamTools/Assets/JamTools/Scripts/Character/FPSCharacterController.cs @@ -0,0 +1,223 @@ +using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace JamTools
+{
+
+ // 第一人称角色控制
+ public class FPSCharacterController : MonoBehaviour
+ {
+ [Flags]
+ public enum CharacterModule
+ {
+ None,
+ LookAround, // 相机环绕
+ MoveAround, // 水平地面移动
+ MoveInAir, // 空中移动
+ Dodge, // 冲刺
+ Rush, // 加速
+ WalkOnSlope, // 斜面移动
+ WalkOnStairs, // 楼梯移动
+ WallRun, // 飞檐走壁
+ Jump, // 跳跃
+ WallJump, // 忍者跳
+ Slide, // 滑铲
+ } + + [SerializeField] private CharacterModule m_Modules; +
+ [SerializeField] private Transform m_Eye;
+
+ [SerializeField] private GroundChecker m_GroundChecker;
+
+ [Header("Look Around")]
+ [SerializeField] private float m_LookSensitive = 1000f;
+ private float m_XRotation;
+
+ [Header("Move Around")]
+ [SerializeField] private float m_MoveSpeed = 100f;
+ private Vector3 m_MoveDirection;
+
+ [Header("Move In Air")]
+ [SerializeField] private float m_MoveSpeedInAir = 50f;
+
+ [Header("Shot")]
+ [SerializeField] private GameObject m_Bullet;
+ [SerializeField] private Transform m_Muzzle;
+
+ private Rigidbody m_Rigidbody;
+ private bool m_LockCursor = false;
+
+ public bool lockCursor
+ {
+ get
+ {
+ return m_LockCursor;
+ }
+ set
+ {
+ m_LockCursor = value;
+ if(value)
+ {
+ Cursor.lockState = CursorLockMode.Locked;
+ }
+ else
+ {
+ Cursor.lockState = CursorLockMode.None;
+ }
+ }
+ }
+
+ bool IsModuleActive(CharacterModule module)
+ {
+ return (module & m_Modules) != 0;
+ }
+
+ void ActivateModule(CharacterModule module)
+ {
+ m_Modules |= module;
+ }
+
+ void LookAround()
+ {
+ if (!IsModuleActive(CharacterModule.LookAround))
+ return;
+
+ float mouseX = Input.GetAxis("Mouse X");
+ float mouseY = Input.GetAxis("Mouse Y");
+
+ m_XRotation -= mouseY * Time.deltaTime * m_LookSensitive;
+ m_XRotation = Mathf.Clamp(m_XRotation, -90, 90);
+
+ m_Eye.localRotation = Quaternion.Euler(m_XRotation, 0, 0);
+
+ transform.Rotate(Vector3.up * mouseX * Time.deltaTime * m_LookSensitive);
+ }
+
+ void MoveAroundUpdate()
+ {
+ if (!IsModuleActive(CharacterModule.MoveAround))
+ return;
+
+ float moveX = Input.GetAxis("Horizontal");
+ float moveZ = Input.GetAxis("Vertical"); +
+ m_MoveDirection = transform.right * moveX + transform.forward * moveZ;
+ m_MoveDirection = m_MoveDirection.normalized;
+
+ }
+
+ void MoveAroundFixedUpdate()
+ {
+ if (!IsModuleActive(CharacterModule.MoveAround))
+ return;
+
+ if (!m_GroundChecker.isOnGround)
+ return;
+
+ float vy = m_Rigidbody.velocity.y;
+ Vector3 velocity = new Vector3(m_MoveDirection.x * Time.deltaTime * m_MoveSpeed, vy, m_MoveDirection.z * Time.deltaTime * m_MoveSpeed);
+
+ m_Rigidbody.velocity = Vector3.Lerp(m_Rigidbody.velocity, velocity, 0.25f);
+ }
+
+ void MoveInAirUpdate()
+ {
+ if (!IsModuleActive(CharacterModule.MoveInAir))
+ return;
+
+ if (m_GroundChecker.isOnGround)
+ return;
+
+ float moveX = Input.GetAxis("Horizontal");
+ float moveZ = Input.GetAxis("Vertical"); +
+ m_MoveDirection = transform.right * moveX + transform.forward * moveZ;
+ m_MoveDirection = m_MoveDirection.normalized;
+ }
+
+ void MoveInAirFixedUpdate()
+ {
+ if (!IsModuleActive(CharacterModule.MoveInAir))
+ return;
+
+ if (m_GroundChecker.isOnGround)
+ return;
+
+ if (m_MoveDirection.magnitude == 0)
+ return;
+
+ float vy = m_Rigidbody.velocity.y;
+ Vector3 velocity = new Vector3(m_MoveDirection.x * Time.deltaTime * m_MoveSpeedInAir, vy, m_MoveDirection.z * Time.deltaTime * m_MoveSpeedInAir);
+
+ m_Rigidbody.velocity = Vector3.Lerp(m_Rigidbody.velocity, velocity, 0.25f);
+ }
+
+ void Jump()
+ {
+ if (!IsModuleActive(CharacterModule.Jump))
+ return;
+
+ if (!m_GroundChecker.isOnGround)
+ return;
+
+ if(Input.GetButtonDown("Jump"))
+ {
+ m_Rigidbody.AddForce(Vector3.up * 300, ForceMode.Acceleration);
+ }
+ }
+
+ void Dodge()
+ {
+ if (!IsModuleActive(CharacterModule.Dodge))
+ return;
+
+ if(Input.GetKeyDown(KeyCode.LeftShift))
+ {
+ m_Rigidbody.AddForce(transform.forward * 5000, ForceMode.Acceleration);
+ }
+ }
+
+ void Shot()
+ {
+ if(Input.GetButtonDown("Fire1"))
+ {
+ GameObject go = GameObject.Instantiate(m_Bullet);
+ go.transform.position = m_Muzzle.position;
+ go.GetComponent<Rigidbody>().velocity = m_Muzzle.forward * 100;
+ }
+ }
+
+ private void Awake()
+ {
+ m_Rigidbody = GetComponent<Rigidbody>();
+ }
+
+ private void Start()
+ {
+ m_XRotation = 0;
+
+ lockCursor = true;
+ }
+
+ private void Update()
+ {
+ LookAround();
+ MoveAroundUpdate();
+ MoveInAirUpdate();
+ Jump();
+ Dodge();
+ Shot();
+ }
+
+ private void FixedUpdate()
+ {
+ MoveAroundFixedUpdate();
+ MoveInAirFixedUpdate();
+ }
+
+ }
+
+}
|