120 lines
2.9 KiB
C#
120 lines
2.9 KiB
C#
using UnityEngine;
|
|
|
|
public class MainCharacterDebugMovement : MonoBehaviour
|
|
{
|
|
[Header("电脑调试移动")]
|
|
[Min(0f)]
|
|
public float moveSpeed = 4f;
|
|
|
|
[Min(0f)]
|
|
public float clickStopDistance = 0.08f;
|
|
|
|
[Header("移动范围")]
|
|
public bool limitToBattlePlatform = true;
|
|
public Vector2 xLimits = new Vector2(-7.5f, 7.5f);
|
|
public Vector2 zLimits = new Vector2(-14f, 14f);
|
|
|
|
private Animator animator;
|
|
private Vector3 clickTarget;
|
|
private bool hasClickTarget;
|
|
|
|
public bool IsMoving =>
|
|
hasClickTarget ||
|
|
new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")).sqrMagnitude > 0.001f;
|
|
|
|
private void Start()
|
|
{
|
|
animator = GetComponent<Animator>();
|
|
clickTarget = transform.position;
|
|
SetWalking(false);
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
HandleClickTarget();
|
|
|
|
Vector3 keyboardInput = new Vector3(
|
|
Input.GetAxisRaw("Horizontal"),
|
|
0f,
|
|
Input.GetAxisRaw("Vertical"));
|
|
|
|
if (keyboardInput.sqrMagnitude > 0.001f)
|
|
{
|
|
hasClickTarget = false;
|
|
Move(keyboardInput.normalized);
|
|
return;
|
|
}
|
|
|
|
if (!hasClickTarget)
|
|
{
|
|
SetWalking(false);
|
|
return;
|
|
}
|
|
|
|
Vector3 toTarget = clickTarget - transform.position;
|
|
toTarget.y = 0f;
|
|
|
|
if (toTarget.magnitude <= clickStopDistance)
|
|
{
|
|
hasClickTarget = false;
|
|
SetWalking(false);
|
|
return;
|
|
}
|
|
|
|
Move(toTarget.normalized);
|
|
}
|
|
|
|
private void HandleClickTarget()
|
|
{
|
|
if (!Input.GetMouseButtonDown(0) || Camera.main == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
|
|
if (!Physics.Raycast(ray, out RaycastHit hit))
|
|
{
|
|
return;
|
|
}
|
|
|
|
clickTarget = hit.point;
|
|
clickTarget.y = transform.position.y;
|
|
hasClickTarget = true;
|
|
}
|
|
|
|
public void StopMovement()
|
|
{
|
|
hasClickTarget = false;
|
|
SetWalking(false);
|
|
}
|
|
|
|
private void Move(Vector3 direction)
|
|
{
|
|
direction.y = 0f;
|
|
if (direction.sqrMagnitude <= 0.001f)
|
|
{
|
|
SetWalking(false);
|
|
return;
|
|
}
|
|
|
|
SetWalking(true);
|
|
transform.position += direction * moveSpeed * Time.deltaTime;
|
|
if (limitToBattlePlatform)
|
|
{
|
|
Vector3 position = transform.position;
|
|
position.x = Mathf.Clamp(position.x, xLimits.x, xLimits.y);
|
|
position.z = Mathf.Clamp(position.z, zLimits.x, zLimits.y);
|
|
transform.position = position;
|
|
}
|
|
|
|
transform.rotation = Quaternion.LookRotation(direction, Vector3.up);
|
|
}
|
|
|
|
private void SetWalking(bool walking)
|
|
{
|
|
if (animator != null)
|
|
{
|
|
animator.SetInteger("speed", walking ? 1 : 0);
|
|
}
|
|
}
|
|
} |