Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向鼠标方向旋转_C#_Unity3d_Rotation - Fatal编程技术网

C# 向鼠标方向旋转

C# 向鼠标方向旋转,c#,unity3d,rotation,C#,Unity3d,Rotation,我想在unity(c#)中朝鼠标位置(2d)旋转一个立方体。我有这个代码,但我不工作: Vector3 a = GameObject.FindGameObjectWithTag("GunTop").transform.position; Vector3 b = GameObject.FindGameObjectWithTag("GunBottom").transform.position; Vector3 c = new Vector3(Input.mousePosition.x, Input.

我想在unity(c#)中朝鼠标位置(2d)旋转一个立方体。我有这个代码,但我不工作:

Vector3 a = GameObject.FindGameObjectWithTag("GunTop").transform.position;
Vector3 b = GameObject.FindGameObjectWithTag("GunBottom").transform.position;
Vector3 c = new Vector3(Input.mousePosition.x, Input.mousePosition.y, Input.mousePosition.x);
float aTob = Vector3.Distance(GameObject.FindGameObjectWithTag("GunTop").transform.position, GameObject.FindGameObjectWithTag("GunBottom").transform.position);
float aToc = Vector3.Distance(GameObject.FindGameObjectWithTag("GunTop").transform.position, new Vector3(Input.mousePosition.x, Input.mousePosition.y, Input.mousePosition.x));
float bToc = Vector3.Distance(GameObject.FindGameObjectWithTag("GunBottom").transform.position, new Vector3(Input.mousePosition.x, Input.mousePosition.y, Input.mousePosition.x));

float winkel = Mathf.Acos(((Vector3.Distance(GameObject.FindGameObjectWithTag("GunTop").transform.position, GameObject.FindGameObjectWithTag("GunBottom").transform.position) * Vector3.Distance(GameObject.FindGameObjectWithTag("GunTop").transform.position, GameObject.FindGameObjectWithTag("GunBottom").transform.position)) + (Vector3.Distance(GameObject.FindGameObjectWithTag("GunBottom").transform.position, new Vector3(Input.mousePosition.x, Input.mousePosition.y, Input.mousePosition.x)) * Vector3.Distance(GameObject.FindGameObjectWithTag("GunBottom").transform.position, new Vector3(Input.mousePosition.x, Input.mousePosition.y, Input.mousePosition.x))) - (Vector3.Distance(GameObject.FindGameObjectWithTag("GunTop").transform.position, new Vector3(Input.mousePosition.x, Input.mousePosition.y, Input.mousePosition.x)) * Vector3.Distance(GameObject.FindGameObjectWithTag("GunTop").transform.position, new Vector3(Input.mousePosition.x, Input.mousePosition.y, Input.mousePosition.x)))) / (2 * Vector3.Distance(GameObject.FindGameObjectWithTag("GunTop").transform.position, GameObject.FindGameObjectWithTag("GunBottom").transform.position) * Vector3.Distance(GameObject.FindGameObjectWithTag("GunBottom").transform.position, new Vector3(Input.mousePosition.x, Input.mousePosition.y, Input.mousePosition.x))));

private void Update()
{
    transform.Rotate(0, 0, winkel);
}
<> Pun> GuopToad和GunBottom是立方体中部最低点,用鼠标创建一个三角形。有人看到这个问题吗?

编辑1: 好的,好消息。现在我必须找到解决问题的方法。第一个像memBrain sad(我做了一点修改):

为了团结一致,我不得不改变一下。第二个解决方案是,我可以优化我的代码,这样它现在就可以工作了:

`   float winkel;
float echterWinkel;
float aTob;
float aToc;
float bToc;
private void Update()
{
    Vector3 a = 
GameObject.FindGameObjectWithTag("GunTop").transform.position;
    Vector3 b = 
GameObject.FindGameObjectWithTag("GunBottom").transform.position;
    Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
    Vector3 dir = Input.mousePosition - pos;
    aTob = Vector3.Distance(a, b);
    aToc = Vector3.Distance(a, dir);
    bToc = Vector3.Distance(b, dir);
    winkel = Mathf.Acos(((aTob * aTob) + (bToc * bToc) - (aToc * aToc)) / (2 
  * aTob * bToc));
    echterWinkel = Mathf.Rad2Deg * winkel;
    if (dir.x < 0)
    {
        transform.rotation = Quaternion.Euler(0, 0, echterWinkel);
    }
    else
    {
        transform.rotation = Quaternion.Euler(0, 0, -echterWinkel);
    }
   }
 }`

为了得到真正的mouesposition?

我觉得你的代码不必要的复杂。你需要这些向量有什么特别的原因吗?然而,下面的代码是Unity论坛()中的一个示例,您可以使用它绕z轴旋转对象

Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
Vector3 dir = Input.mousePosition - pos;
float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
就这么简单

编辑:请记住,转换将是目标游戏对象的转换

另一方面,示例中的无效代码效率相当低。您已经声明了不使用的向量和不使用的浮点。因此,您可以使用这些存储值替换大量代码

Vector3 a = GameObject.FindGameObjectWithTag("GunTop").transform.position;
Vector3 b = GameObject.FindGameObjectWithTag("GunBottom").transform.position;
Vector3 c = new Vector3 (
    Input.mousePosition.x, 
    Input.mousePosition.y, 
    Input.mousePosition.x
);
float aTob = Vector3.Distance(a, b);
float aToc = Vector3.Distance(a, c);
float bToc = Vector3.Distance(b, c);

float winkel = Mathf.Acos (
    (
        (
            aTob * aTob
        ) + 
        (
            bToc * bToc
        ) -
        (
            aToc * aToc
        )
    ) / 
    (
        2 * aTob * bToc
    )
);

private void Update()
{
    transform.Rotate(0, 0, winkel);
}
请注意,正确使用存储值后,代码现在看起来简单多了。我还冒昧地使用了类似于大括号的括号,以使长行代码更具可读性。你需要记住一件事。查找可能很昂贵。如果没有必要,请不要多次查找

我没有费心检查代码是否正确。我甚至无法验证您的查找是否会返回值。事实上,这可能是这段代码的一个问题。如果任何一个查找失败,您将在a或b或两者中存储空值!您需要某种条件检查来验证a和b是否有成功的查找,如果没有,该怎么办。现在的情况是,当您第一次尝试对a或b执行操作时,就会出现故障。目标是优雅地失败,而不是强行失败

编辑2:再次查看所有内容时,我注意到另一个问题。您的目的是绕z轴旋转,并将z坐标设置为Input.mousePosition.x。这是错误的。您应该将其设置为固定值,如“0”。你不想把z和x绑在一起

编辑3:

对。这两行与获取鼠标位置有关。让我解释一下这里发生了什么

Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
该行将“枪”对象的世界坐标(transform.position)转换为屏幕点坐标,并将其存储在pos中

Vector3 dir = Input.mousePosition - pos;
这一行获取鼠标位置向量,并从中减去之前的位置向量(pos),然后将其存储在dir中(可能用于“方向”)。您可以按如下方式轻松更改矢量3 c:

Vector3 c = Input.mousePosition;
GameObject gun;

void Start()
{
    /*
        initialization code for gun GameObject
    */
}

void Update()
{
    Vector3 gunScreenPosition = Camera.main.WorldToScreenPoint(gun.transform.position);
    Vector3 mouseDirection = Input.mousePosition - gunScreenPosition;
    float angle = Mathf.Atan2(mouseDirection.y, mouseDirection.x) * Mathf.Rad2Deg;
    gun.transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
}
这相当于您所做的操作,而不需要创建新矢量3并像您所做的那样显式地为其指定矢量坐标

float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
这一行取代了winkel。因此,您的整个代码可以压缩如下:

Vector3 c = Input.mousePosition;
GameObject gun;

void Start()
{
    /*
        initialization code for gun GameObject
    */
}

void Update()
{
    Vector3 gunScreenPosition = Camera.main.WorldToScreenPoint(gun.transform.position);
    Vector3 mouseDirection = Input.mousePosition - gunScreenPosition;
    float angle = Mathf.Atan2(mouseDirection.y, mouseDirection.x) * Mathf.Rad2Deg;
    gun.transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
}
您真的不需要使用所有额外的代码。你需要枪托和枪托有什么特别的原因吗?如果只是为了计算枪的位置,我的例子就是你所需要的


如果我不多分享一件事,那我就是失职了。使用四元数时要小心。Euler(…)。它可能会出现被称为“

Is Input”的情况。鼠标在屏幕空间中的位置?如果是这样,那么这至少是问题的一部分。是的,我认为这是一部分,我如何才能得到鼠标位置?哇,谢谢,这非常有用。我想使用存储值,但unity不允许,所以我选择了非存储值。我需要向量来创建一个三角形,并使用arcos来获得角度。我会尝试你的代码,我会尝试正确地编写代码。非常感谢:)不客气。如果您需要任何进一步的帮助,请告诉我。@Gmunderos7,我已经提供了Unity网站上MathF.Atan2文档的链接。我还复制了你的“答案”,作为对你原始帖子的编辑(有待审核)。我的理解是,你最好扩展你原来的帖子,而不是添加新的答案。因此,我建议在我的编辑被修改后删除你的帖子。好的,谢谢。第一行我需要把枪的位置从世界空间转换到屏幕空间,然后减去枪的位置,得到鼠标相对于枪的位置,对吗?我需要转换枪的位置来减去它,对吗?是否也可以将鼠标位置转换为世界空间以进行减法?