繁体   English   中英

Unity 向鼠标 position 移动有限距离

[英]Unity move towards mouse position for limited distance

我正在开发一个自上而下的 2D 游戏项目。 角色必须一直跟随鼠标cursor,这是我目前能做到的。 我还希望角色在单击时向鼠标滑动一段有限的距离。

所以假设字符 position 是:0, 0, 0 鼠标点击 position: 8, 4, 0 点击时,角色必须向鼠标点击 Z4757FE07FD492A8BE0EA6A760D683 2. 所以最终的字符位置应该是:2,2,0

我怎样才能做到这一点? 这是我的代码;

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovemetn : MonoBehaviour
{

    private float speed = 4;
    private float slideSpeed = 8;
    private Vector3 targetPosition;
    private bool isMoving = false;

    void Update()
    {
        SetTargetPosition();

        if (Input.GetMouseButton(0))
        {
            //Slide 2 meters towards mouse location (with the speed of slideSpeed variable)
        }
        
        if (isMoving)
        {
            Move();
        }

        
    }

    void SetTargetPosition()
    {
        targetPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

        targetPosition.z = transform.position.z;

        isMoving = true;
    }

    void Move()
    {
        transform.position = Vector2.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);

        if (transform.position == targetPosition)
        {
            isMoving = false;
        }
    }
}

我猜的主要问题是,只要按住鼠标按钮,您就会不断更新 targetPosition。 这将很难判断您实际希望从哪个起点允许最大距离以及何时允许新范围。

我假设您允许在鼠标按下的那一刻您的_originalPosition在 _originalPosition 周围的maxDistance范围内移动。

然后您可以使用Vector2.ClampMagnitude计算存储的_originalPosition周围的范围,例如

// For 2D use Vector2 right away
private Vector2 targetPosition;

[SerializeField] private float maxDistance;

private void Update()
{
    // Only update the target for the first click position
    if (Input.GetMouseButtonDown(0))
    {
        SetTargetPosition()
    }

    if (isMoving)
    {
        Move();
    }
}

void SetTargetPosition()
{
    // as before get your target position
    var tempTargetPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

    // Calculate a delta vector _originalPosition -> tempTargetPosition
    // then make sure its magnitude is maximum maxDistance
    var delta = Vector2.ClampMagnitude(tempTargetPosition - transform.position, maxDistance);

    // Calculate and update the actual target position
    targetPosition = transform.position + delta;

    isMoving = true;
}

您可以简单地计算 Origin 和 Destination 之间的增量距离及其向量。 在标准化这些值之后,您可以将它们与某种“基本距离”相乘,例如在这种情况下您的 (2, 2, 0) 并从您的目的地添加/减去它,这样的事情应该可以解决问题:

var delta = (Destination - origin).normalized;
delta *= baseDistance;
var targetDestination = Destination - delta;

但请记住,(0,2,0) 比 (2,2,0) 更接近,因此您可能需要熟练使用该计算

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM