Practice_Unity/Assets/Scripts/Controllers/PlayerController.cs
SEAN-59 f70e9e6e0a 컨트롤러 작업
1. 마우스 클릭 이동
2. 스테이터스 동작 연동
3. 행동 동작 연동

ToDo
1. 공격 모션 추가 하기
2. 점프 모션 추가 하기
3. JSON으로 들어오는 데이터 파싱해서 스테이터스에 담아보기

4. 실제로 AI (적) 구상해서 작성하기.
2025-09-19 00:38:33 +09:00

169 lines
4.8 KiB
C#

using System;
using Animation;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerController : MonoBehaviour
{
private AnimatorManager<AnimatorParam> _mAnimator;
private Vector3 _destPos;
private Status_Player _status;
enum AnimatorParam
{
speed,
atk_speed,
attack,
run,
}
enum PlayerBehavior
{
Idle,
Move,
Attack,
Die
}
private PlayerBehavior _behavior = PlayerBehavior.Idle;
private PlayerBehavior Behavior
{
get { return _behavior; }
set
{
_behavior = value;
switch (_behavior)
{
case PlayerBehavior.Die:
_mAnimator.SetValue(AnimatorParam.attack, false);
break;
case PlayerBehavior.Idle:
_mAnimator.SetValue(AnimatorParam.speed, 0);
_mAnimator.SetValue(AnimatorParam.attack, false);
break;
case PlayerBehavior.Move:
_mAnimator.SetValue(AnimatorParam.speed, _status.MoveSpeed);
_mAnimator.SetValue(AnimatorParam.attack, false);
break;
case PlayerBehavior.Attack:
_mAnimator.SetValue(AnimatorParam.attack, true);
break;
}
}
}
private void Awake()
{
_mAnimator = new AnimatorManager<AnimatorParam>(GetComponent<Animator>());
_status = gameObject.GetComponent<Status_Player>();
}
void Start()
{
Manager.Input.MouseAction -= OnMouseClicked;
Manager.Input.MouseAction += OnMouseClicked;
SetAnimator();
}
void SetAnimator()
{
_mAnimator.SetValue(AnimatorParam.atk_speed,_status.AtkSpeed);
}
void Update()
{
switch (_behavior)
{
case PlayerBehavior.Idle:
UpdateIdle();
break;
case PlayerBehavior.Move:
UpdateMove();
break;
case PlayerBehavior.Attack:
break;
case PlayerBehavior.Die:
break;
}
}
void OnMouseClicked(Define.MouseEvent evt)
{
if (Behavior == PlayerBehavior.Die) return;
RaycastHit hit;
Ray ray = Camera.main.ScreenPointToRay((Vector3)Mouse.current.position.ReadValue());
bool raycastHit = Physics.Raycast(ray, out hit, 100.0f, LayerMask.GetMask("Ground"));
// --- 디버그 시각화 ---
// if (raycastHit)
// {
// // 레이캐스트 성공 시: 부딪힌 곳까지 빨간 선 표시
// Debug.DrawRay(ray.origin, ray.direction * hit.distance, Color.red, 1.0f);
//
// // 마우스를 처음 눌렀을 때만 디버그용 구 생성
// if (evt == Define.MouseEvent.Down)
// {
// GameObject debugSphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
// debugSphere.transform.position = hit.point;
// debugSphere.transform.localScale = Vector3.one * 0.5f;
// debugSphere.GetComponent<Collider>().enabled = false;
// GameObject.Destroy(debugSphere, 3.0f);
// }
// }
// else
// {
// // 레이캐스트 실패 시: 긴 노란 선 표시
// Debug.DrawRay(ray.origin, ray.direction * 100.0f, Color.yellow, 1.0f);
// }
// --- 디버그 시각화 끝 ---
// 레이캐스트가 아무것도 맞추지 못했다면, 이후 로직을 실행하지 않음
if (!raycastHit) return;
// --- 실제 게임 로직 ---
switch (evt)
{
case Define.MouseEvent.Click:
case Define.MouseEvent.Down:
_destPos = hit.point;
Behavior = PlayerBehavior.Move;
break;
case Define.MouseEvent.Press:
_destPos = hit.point;
break;
}
}
void UpdateIdle()
{
}
void UpdateMove()
{
Vector3 dir = _destPos - transform.position;
if (dir.magnitude < 0.1f) Behavior = PlayerBehavior.Idle;
else
{
float moveDist = Mathf.Clamp(_status.MoveSpeed * Time.deltaTime, 0, dir.magnitude);
transform.position += dir.normalized * moveDist;
Vector3 targetDir = new Vector3(dir.x, 0, dir.z).normalized;
if(targetDir != Vector3.zero)
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(targetDir), 0.15f);
}
}
void UpdateAttack()
{
}
}