Project_WL/Assets/ThirdParty/Joystick Pack/Scripts/Joysticks/FloatingJoystick.cs

75 lines
3.4 KiB
C#

using UnityEngine;
using UnityEngine.EventSystems;
public class FloatingJoystick : Joystick
{
protected override void Start()
{
base.Start();
background.gameObject.SetActive(false);
}
private void Update()
{
if (MyValue.bMyPC && MyValue.MyPC.CanMove())
{
// Cursor.lockState를 None으로 설정하여 마우스 고정 해제
if (Cursor.lockState == CursorLockMode.Locked)
{
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
// 카메라의 방향을 고려한 입력 변환
Vector3 cameraForward = Camera.main.transform.forward;
Vector3 cameraRight = Camera.main.transform.right;
// 카메라의 수직 축을 무시하고 평면에서만 계산
cameraForward.y = 0;
cameraRight.y = 0;
// 입력 방향을 카메라 방향에 맞춰 변환
Vector3 direction = cameraForward.normalized * Vertical + cameraRight.normalized * Horizontal;
if (OptionInfo.Ins.Get_PCMove() && direction != Vector3.zero)
{
// WL #849 (2026-10-12) — 섬 MainCamera 에는 RealCamera 가 없어 다음 줄이 매 프레임 NullReference 팝업을 냈다.
// 예외 때문에 섬에서는 원래 아래 이동(Run_byJoystick)도 실행된 적이 없다(섬 이동 = FI 조이스틱) → 이동 블록 전체를 건너뛰어 동작은 그대로 · 예외만 없앤다.
if (MyValue.m_RealCamera == null) return;
MyValue.m_RealCamera.Set_DistanceUp(Vertical < 0); // 아래로 움직일 경우
MyValue.m_RealCamera.m_BackMove = Vertical < 0;
MyValue.MyPC.Run_byJoystick(direction);
}
}
}
public override void OnPointerDown(PointerEventData eventData)
{
background.anchoredPosition = ScreenPointToAnchoredPosition(eventData.position);
background.gameObject.SetActive(true);
if (MyValue.bMyPC && MyValue.MyPC.CanMove())
{
MyValue.MyPC.Set_AutoBraking(false);
MyValue.MyPC.Set_JoystickStatus(1);
}
base.OnPointerDown(eventData);
}
public override void OnPointerUp(PointerEventData eventData)
{
background.gameObject.SetActive(false);
base.OnPointerUp(eventData);
// WL #952-④ (2026-10-20) — 누름(OnPointerDown)은 PCMove 와 무관하게 Set_AutoBraking(false)(IsStop = true · 자동 전투 중단) + JoystickStatus 1 을 걸지만 뗌은 PCMove 가 꺼져 있으면 건너뛰어
// 스킬이 PCMove 를 끈 채 끝나면(해머 강력한 일격 실측) 캐릭터가 영영 굳었다(PD 에디터 실측: IsStop true · JoystickStatus 1 · 대기). 누름이 걸어 둔 상태(JoystickStatus 1)는 PCMove 와 무관하게 되돌린다.
if (MyValue.bMyPC && (MyValue.MyPC.JoystickStatus == 1 || (OptionInfo.Ins.Get_PCMove() && MyValue.MyPC.CanMove())))
{
MyValue.MyPC.Set_JoystickStatus(0);
MyValue.MyPC.Set_AutoBraking(true);
if (MyValue.m_RealCamera != null) // WL #849 — 섬에는 RealCamera 가 없다(위와 같은 가드)
{
MyValue.m_RealCamera.Set_DistanceUp(false);
MyValue.m_RealCamera.m_BackMove = false;
}
}
}
}