187 lines
4.3 KiB
C#
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
|
|
}
|