Files
test/Assets/Scripts/CharacterCtrl.cs
T
2025-09-08 09:57:23 +07:00

187 lines
4.3 KiB
C#

using CSNetwork.Protocols;
using CSNetwork.Protocols.RPCData;
using System.Data;
using System.Text;
using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
using UnityEngine.Windows;
public class CharacterCtrl : MonoBehaviour
{
[SerializeField] private TextMeshPro txtName;
[SerializeField] private CharacterController controller;
[SerializeField] private Animator animator;
[SerializeField] private Joystick joystick;
[SerializeField] private Button btnJump;
[SerializeField] private Button btnRun;
PlayerStateMachine playerStateMachine;
PlayerMoveState moveState;
float playerSpeed = 5.0f;
float jumpHeight = 1.5f;
float gravityValue = -9.81f;
StateAnim stateAnim = StateAnim.Idle;
Vector3 playerVelocity;
[SerializeField] bool isGrounded = false;
bool isRun = false;
private void Awake()
{
moveState = new PlayerMoveState(this);
playerStateMachine = new PlayerStateMachine();
}
private void Start()
{
playerStateMachine.InitState(moveState);
//btnJump.onClick.AddListener(HandleJump);
}
private void HandleJump()
{
if (isGrounded)
{
playerVelocity.y = Mathf.Sqrt(jumpHeight * -2f * gravityValue);
SetAnimJump();
}
}
public void SetStatusRun(bool value)
{
if (!isGrounded)
{
Debug.LogError("Player not in ground");
return;
}
isRun = value;
}
public void InitCharacter(RoleInfo role)
{
string roleName = "(Error decoding name)";
if (role.name != null && role.name.ByteArray != null)
{
// Be careful with encoding, assume UTF8 is correct
roleName = Encoding.UTF8.GetString(
role.name.ByteArray,
0,
role.name.Length
);
}
Vector3 pos = new Vector3(role.posx, role.posy, role.posz);
if(txtName != null)
{
txtName.text = roleName;
}
transform.position = pos;
Debug.LogError("Pos Character = " + pos);
}
private void Update()
{
playerStateMachine.UpdateState();
}
public void HandleMovement()
{
isGrounded = controller.isGrounded;
if (UnityEngine.Input.GetKeyDown(KeyCode.LeftShift))
{
SetStatusRun(true);
}
if (UnityEngine.Input.GetKeyUp(KeyCode.LeftShift))
{
SetStatusRun(false);
}
if (UnityEngine.Input.GetKeyDown(KeyCode.Space))
{
HandleJump();
}
if (isGrounded && playerVelocity.y < 0)
{
playerVelocity.y = 0f;
}
float x = joystick.Horizontal;
float z = joystick.Vertical;
Vector3 move = new Vector3(x, 0, z);
move = Vector3.ClampMagnitude(move, 1f);
if (move != Vector3.zero)
{
transform.forward = move;
if (isRun)
{
SetAnimRun();
}
else
{
SetAnimWalk();
}
}
else
{
SetAnimIdle();
}
playerVelocity.y += gravityValue * Time.deltaTime;
Vector3 finalMove = (move * playerSpeed) + (playerVelocity.y * Vector3.up);
controller.Move(finalMove * Time.deltaTime);
}
private void SetAnimIdle()
{
if(stateAnim == StateAnim.Idle || !isGrounded)
{
return;
}
stateAnim = StateAnim.Idle;
animator.SetTrigger("Idle");
}
private void SetAnimRun()
{
if (stateAnim == StateAnim.Run || !isGrounded)
{
return;
}
stateAnim = StateAnim.Run;
animator.SetTrigger("Run");
}
private void SetAnimWalk()
{
if (stateAnim == StateAnim.Walk || !isGrounded)
{
return;
}
stateAnim = StateAnim.Walk;
animator.SetTrigger("Walk");
}
private void SetAnimJump()
{
if (stateAnim == StateAnim.Jump)
{
return;
}
stateAnim = StateAnim.Jump;
animator.SetTrigger("Idle");
}
}
public enum StateAnim
{
Idle = 1,
Walk = 2,
Run = 3,
Jump = 4
}