Unity 3d,将对象指向鼠标(3d空间)

时间:2019-01-20 01:03:01

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

我搜索了一段时间,但是我不知道如何解决这个讨厌的错误。我使用的是自顶向下的视图(指向-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时就会破裂;

任何提示将不胜感激:)

p.s。我要在z上加1,然后将其重置,因为否则,无论我将指针移到何处,mouseToWorld始终为0。

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

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

Vector3 mouseToWorld = Camera.main.ScreenToWorldPoint(Input.mousePosition-新的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);