首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unity 3d,将对象指向鼠标(3d空间)

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

Stack Overflow用户
提问于 2019-01-20 09:03:01
回答 2查看 1.3K关注 0票数 0

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

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

我使用了以下代码:

代码语言:javascript
复制
 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。

EN

回答 2

Stack Overflow用户

发布于 2019-01-20 09:35:01

也许是因为速度矢量和鼠标方向不一样,所以它就断了。

下面的脚本将使一个箭头跟随鼠标,它基本上与您的相同,只是它也更新了位置:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-01-20 10:01:56

谢谢你的回答!我计算出你需要减去播放器和相机之间的距离到鼠标的初始位置:

新位置= Camera.main.ScreenToWorldPoint(Input.mousePosition - Vector3 mouseToWorld ( 0,0,Camera.main.trans.postion.z);

下面是工作脚本:

代码语言:javascript
复制
    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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54272709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档