Unity 2D C#如何在点击时制作面向对象的坐标

Posted

技术标签:

【中文标题】Unity 2D C#如何在点击时制作面向对象的坐标【英文标题】:Unity 2D C# How can I can make object facing coordinates on click 【发布时间】:2021-09-09 17:11:59 【问题描述】:

我想为统一(2D)制作一个简单的 C# 脚本。我想在我用鼠标单击的方向上缓慢旋转一个对象(图像)。我一直在寻找它,只发现如何在已知方向上缓慢旋转它,以及如何在我点击的地方旋转,但它并不慢。我试图将这两种机制结合起来,但没有任何效果。这是我当前的一段代码:

Vector2 direction = new Vector2(0.0f, 0.0f);

void Update()
    
        if (Input.GetMouseButtonDown(0))
        
            destinationX = clicked('x');
            destinationY = clicked('Y');
            direction = new Vector2(clicked('x') - transform.position.x, clicked('y') - transform.position.y);
        

        transform.Rotate(new Vector3() * Time.deltaTime * 10.2f, Space.World);
        transform.position += transform.forward * Time.deltaTime * 0.2f;
    

    float clicked(char axis)
    
        if (axis == 'x')
        
            return Camera.main.ScreenToWorldPoint(Input.mousePosition).x;
        
        else
        
            return Camera.main.ScreenToWorldPoint(Input.mousePosition).y;
        
    

我知道它变得非常混乱,我什至不知道是否所有东西都被使用了,因为我在寻找答案时失去了理智(这就是我在这里的原因)。

请帮忙,谢谢!

【问题讨论】:

【参考方案1】:

您将new Vector3() 作为参数传递给Rotate

这等于使用new Vector3(0,0,0),所以无论你乘以什么,它都将保持0,0,0 =>你没有在任何轴上旋转对象。


您可能更愿意使用例如Mathf.Atan2 这将为您提供 Z 旋转,以便查看位置 X、Y 相对于您的对象位置(== 方向)。

返回值以 弧度 为单位,因此您还必须将其乘以 Mathf.Rad2Deg。 现在知道 Z 轴上所需的角度后,您可以使用 Quaternion.Euler 从该角度生成 Quaternion 并将其存储(= targetRotation)。

最后,您可以使用Quaternion.RotateTowards 以针对目标旋转以线性速度平滑旋转而不会超调。

// Adjust these via the Inspector
// In angle per second
[SerializeField] private float rotationSpeed = 10.2f;
// In Units per second
[SerializeField] private float movementSpeed = 0.2f;

// If possible assign via the Inspector
[SerializeField] private Camera _camera;

private void Awake ()

    // As fallback get ONCE
    if(!_camera) _camera = Camera.main;

    targetRotation = transform.rotation;



private Quaternion targetRotation;

void Update()

    if (Input.GetMouseButtonDown(0))
    
        // Instead of 4 repeated calls store this ONCE
        // directly use Vector2, you don't care about the Z axis
        Vector2 destination = _camera.ScreenToWorldPoint(Input.mousePosition);
        // directly use the Vector2 substraction for getting the direction vector without the Z axis
        Vector2 direction = destination - (Vector2)transform.position;

        // Use Atan2 to get the target angle in radians
        // therefore multiply by Rad2Deg to get degrees
        var zAngle = Mathf.Atan2(direction.x, direction.y) * Mathf.Rad2Deg;
        // Store the target rotation
        targetRotation = Quaternion.Euler(0,0, zAngle);
    

    // Rotate smoothly with linear rotationSpeed against the targetRotation
    // this prevents any overshooting
    transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);
    // In 2D you most probably do not want to move forward which is the Z axis but rather e.g. right on the X axis
    transform.position += transform.right * Time.deltaTime * movementSpeed;

【讨论】:

谢谢!它工作得很好......但不知何故,当我改变rotationSpeed和motionSpeed它实际上并没有变得更快......而且它除了旋转之外不会移动。 哦,抱歉...它向前移动但在 z 方向,所以我没看到...我怎样才能更改为只有 x 和 y 而不是 z? @DEMON 使用 transform.right 而不是 transform.forward 但它不会朝着正确的方向移动吗?我的意思是,如果它不只是移动到屏幕的右侧?无论如何我会试试的,所以谢谢! 好吧 forward 通常是 Z 轴 ...如果你只想要 xy 轴,它的父亲可能应该是 transform.righttransform.up【参考方案2】:

您可以使用Quaternion.Lerp 平滑地旋转对象。

 transform.rotation = Quaternion.Lerp(from.rotation, to.rotation, Time.time * speed);

您也可以使用Vector3.Lerp作为职位

【讨论】:

我写了transform.rotation = Quaternion.Lerp(transform.rotation.z, direction, Time.time * 3.0f); 并得到一个错误,我无法从 UnityEgine.Vector2 转换为 UnityEngine.Quaterion (arg 2) 并且无法从 float 转换为 UnityEngine.Quaterion 我该怎么办现在? 当速度不是 3.0f 时我也没有任何错误,只是速度不存在 我更改了它并得到或没有错误(transform.rotation = Quaternion.Lerp(transform.rotation, transform.rotation, Time.time * 3.0f); 并且没有任何移动(因为我认为它无处可移动)或 1 个错误(transform.rotation = Quaternion.Lerp(transform.rotation, direction, Time.time * 3.0f);)...我该怎么做方向对这个方法有效吗?

以上是关于Unity 2D C#如何在点击时制作面向对象的坐标的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Unity C# 中检查对象是不是面向某个方向

我不能将脚本分配给 UNITY 中的按钮?

弹丸不移动,也不从玩家开始(Unity 2D / C#)

Unity3D c# 2D Game Camera Follow 正在跳跃

Unity 2D Top Down Shooter 运动问题 C#

如何在Unity中实现射线判断鼠标所点击的2D游戏对象?