75 lines
3.4 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
} |