【问题标题】:Unity 3d, point object towards mouse (3d space)Unity 3d,将对象指向鼠标(3d 空间)
【发布时间】:2019-01-20 01:03:00
【问题描述】:

我搜索了一段时间,但不知道如何解决这个讨厌的错误。我使用的是自上而下的视图(指向 -z),基本上是 2d,3d 对象和相机处于透视模式。

我需要将一个对象指向鼠标,忽略 z 方向,因为一切都在同一平面上移动。

我正在使用以下代码:

 Vector3 mouseToWorld = Camera.main.ScreenToWorldPoint(Input.mousePosition + new Vector3(0, 0, 1f));
 mouseToWorld.z = 0f;
 Vector3 difference = mouseToWorld - transform.position;
 difference.Normalize();
 float angle = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
 transform.rotation = Quaternion.Euler(0f, 0f, angle - 90);

不幸的是它只在物体静止时起作用,并且在速度> 0时立即中断;

任何提示将不胜感激:)

附言我将 1 添加到 z 然后重置它,因为否则无论我移动指针,mouseToWorld 始终为 0。

【问题讨论】:

标签: c# visual-studio unity3d vector euler-angles


【解决方案1】:

可能是因为速度矢量和鼠标方向不一样而中断了。

下面的脚本会让一个箭头跟随鼠标,它和你的基本一样,除了它也会更新位置:

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

public class FollowMouse : MonoBehaviour {
    public float moveSpeed = 0.01f;
    // Use this for initialization
    void Start () {
    }

  // Update is called once per frame
  void Update () {
        transform.position = Vector2.Lerp(transform.position, Camera.main.ScreenToWorldPoint(Input.mousePosition), moveSpeed);

        Vector3 difference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
        difference.Normalize();
        float rotation_z = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
        transform.rotation = Quaternion.Euler(0f, 0f, rotation_z);
    }
}

【讨论】:

    【解决方案2】:

    感谢您的回答!我发现您需要将播放器和相机之间的距离减去初始鼠标位置:

    Vector3 mouseToWorld = Camera.main.ScreenToWorldPoint(Input.mousePosition - new Vector3(0, 0, Camera.main.transform.position.z));

    这里是工作脚本:

        Vector3 mouseToWorld = Camera.main.ScreenToWorldPoint(Input.mousePosition - new Vector3(0, 0, Camera.main.transform.position.z));
        //Debug.DrawLine(transform.position, mouseToWorld);
        mouseToWorld.z = 0f;
        Vector3 difference = mouseToWorld - transform.position;
        difference.Normalize();
    
        float angle = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
        transform.rotation = Quaternion.Euler(0f, 0f, angle - 90);
    

    【讨论】:

      猜你喜欢
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      相关资源
      最近更新 更多