【问题标题】:Object Follow Mouse Dragging Unity 3D对象跟随鼠标拖动 Unity 3D
【发布时间】:2019-01-10 10:52:32
【问题描述】:

我有一个对象不断向前移动,我想通过鼠标拖动屏幕的任何部分(滑动)使它在 X 轴上移动,所以我尝试了这段代码,但是当第一次点击屏幕时,对象移动到鼠标 X 位置(不拖动)!你对如何让它只在拖动时移动有什么建议吗?

脚本:

private bool dragging = false;
private float distance;

public Rigidbody Ball;
public float Speed = 100;


// Use this for initialization
void Start () {

}

// Update is called once per frame
void FixedUpdate () {

    Ball.velocity = transform.forward * Speed * Time.deltaTime;
}


void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        distance = Vector3.Distance(transform.position, Camera.main.transform.position);
        dragging = true;
    }

    if(Input.GetMouseButtonUp(0))
    {
        dragging = false;
    }

    if (dragging)
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        Vector3 rayPoint = ray.GetPoint(distance);
        transform.position = new Vector3(rayPoint.x, transform.position.y, transform.position.z);
    }
}

【问题讨论】:

  • 您要移动的对象是该组件所附加的对象吗?那个对象也是刚体Ball所连接的那个对象吗?在这种情况下使用Rigidbody.MovePosition 而不是通过Transform 组件设置位置!
  • @derHugo 我已经编辑了帖子,请再次检查。
  • 那么现在代码非常不同......你没有回答我的问题^^而且..因为你在MouseDown(点击的那一刻)上将draggin设置为true,然后设置位置。为什么要删除 OnMouseDownOnMouseDrag 实现?
  • 我删除它是因为我想在拖动屏幕上的任何地方时移动对象
  • 哦,我明白了,让我更新我的答案^^

标签: c# unity3d


【解决方案1】:

对于继续移动,您可以使用GetMouseButton,在按钮保持按下状态时为真(与GetMouseButtonDown 相反,仅在按下按钮的第一帧时为真)

您说脚本与RigiBody 组件相同。在这种情况下,您永远不应该使用

transform.position = ...

但改用RigidBody.MovePosition like

Ball.MovePosition(new Vector3( ... ));

最后存储鼠标按下时的初始位置,然后将其用作参考点:

Vector3 initialPosition;

void Update()
{
    // called the first time mouse button is pressed
    if (Input.GetMouseButtonDown(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        initialPosition = transform.position;

        Vector3 rayPoint = ray.GetPoint(0);

        // Not sure but this might get you a slightly better value for distance
        distance = Vector3.Distance(transform.position, rayPoint );
    }

    // called while button stays pressed
    if (Input.GetMouseButton(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        Vector3 rayPoint = ray.GetPoint(distance);
        Ball.MovePosition(initialPosition + new Vector3(rayPoint.x, 0, 0));
    }
}

另外请注意,我不确定

// Update is called once per frame
void FixedUpdate () {
    Ball.velocity = transform.forward * Speed * Time.deltaTime;
}

是你想要做的。在我看来,Time.deltaTime 的使用在这里没有多大意义。您要么想将速度设置为某个速度,例如

Ball.velocity = transform.forward * Speed;

或者您想使用Time.deltaTime 更改位置以实现平滑移动

Ball.MovePosition(transform.position + transform.forward * Speed * Time.deltaTime);

【讨论】:

  • 它仍然移动而不拖动:(
  • 您将dragging 定义为什么?也许我还没有完全理解你要做什么
  • 第一次单击时对象仍在移动到鼠标位置,我希望对象仅在单击+移动鼠标时移动。
  • 我更新了我的答案。我想我现在明白了:您想单击屏幕上的任意位置,而不是仅使用当前值与初始 mouseDown 位置之间的差异。但我还是不确定……你真的要在全局 X 轴上移动对象吗?
  • 我使用了这一行“Ball.MovePosition(new Vector3(rayPoint.x + initialPosition.x, transform.position.y, transform.position.z));”而不是这个“Ball.MovePosition(initialPosition + new Vector3(rayPoint.x, 0, 0));”仅在 X 轴上移动它,但是当单击并释放对象在 X 轴上快速移动时,我仍然得到一个奇怪的移动。
猜你喜欢
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多