104 lines
2.4 KiB
C#
104 lines
2.4 KiB
C#
using System.Collections;
|
|
using UnityEngine;
|
|
|
|
public class JunpyoRunToPoint : MonoBehaviour
|
|
{
|
|
[Header("Junpyo")]
|
|
[SerializeField] private Transform junpyo;
|
|
|
|
[Header("Target")]
|
|
[SerializeField] private Transform junpyoStopPoint;
|
|
|
|
[Header("Movement")]
|
|
[SerializeField] private float moveDuration = 1.2f;
|
|
[SerializeField] private bool faceMoveDirection = true;
|
|
|
|
private bool isMoving;
|
|
private bool hasMoved;
|
|
|
|
// 대화가 시작될 때 호출
|
|
public void RunToStopPoint()
|
|
{
|
|
if (isMoving || hasMoved)
|
|
return;
|
|
|
|
if (junpyo == null || junpyoStopPoint == null)
|
|
{
|
|
Debug.LogWarning("구준표 또는 JunpyoStopPoint가 연결되지 않았습니다.");
|
|
return;
|
|
}
|
|
|
|
hasMoved = true;
|
|
StartCoroutine(MoveRoutine());
|
|
}
|
|
|
|
private IEnumerator MoveRoutine()
|
|
{
|
|
isMoving = true;
|
|
|
|
Vector3 startPosition = junpyo.position;
|
|
Quaternion startRotation = junpyo.rotation;
|
|
|
|
Vector3 targetPosition = junpyoStopPoint.position;
|
|
targetPosition.y = startPosition.y;
|
|
|
|
Vector3 direction = targetPosition - startPosition;
|
|
direction.y = 0f;
|
|
|
|
Quaternion targetRotation = startRotation;
|
|
|
|
if (faceMoveDirection && direction.sqrMagnitude > 0.001f)
|
|
targetRotation = Quaternion.LookRotation(direction.normalized);
|
|
|
|
float elapsed = 0f;
|
|
|
|
while (elapsed < moveDuration)
|
|
{
|
|
elapsed += Time.deltaTime;
|
|
float t = Mathf.Clamp01(elapsed / moveDuration);
|
|
|
|
junpyo.position = Vector3.Lerp(
|
|
startPosition,
|
|
targetPosition,
|
|
t
|
|
);
|
|
|
|
if (faceMoveDirection)
|
|
{
|
|
junpyo.rotation = Quaternion.Slerp(
|
|
startRotation,
|
|
targetRotation,
|
|
t
|
|
);
|
|
}
|
|
|
|
yield return null;
|
|
}
|
|
|
|
// 마지막 위치를 정확하게 맞춤
|
|
junpyo.position = targetPosition;
|
|
|
|
if (faceMoveDirection)
|
|
junpyo.rotation = targetRotation;
|
|
|
|
isMoving = false;
|
|
}
|
|
|
|
public void ResetMovement()
|
|
{
|
|
hasMoved = false;
|
|
isMoving = false;
|
|
}
|
|
|
|
[ContextMenu("Test Run")]
|
|
private void TestRun()
|
|
{
|
|
RunToStopPoint();
|
|
}
|
|
|
|
[ContextMenu("Reset Run")]
|
|
private void TestResetRun()
|
|
{
|
|
ResetMovement();
|
|
}
|
|
} |