游戏对象 transform.Rotate()
GameObject transform.Rotate()
我有一个问题。我在屏幕上有 4 个物体和一个弹丸,如下图所示。
image source
当我点击 4 射弹中的一个物体时,它会改变位置,指示我点击的物体。
这是使用的代码,但它不起作用。
public GameObject Tun;
public GameObject[] robotColliders;
public GameObject[] Robots;
foreach(GameObject coll in robotColliders)
{
coll.GetOrAddComponent<MouseEventSystem>().MouseEvent += SetGeometricFigure;
}
private void SetGeometricFigure(GameObject target, MouseEventType type)
{
if(type == MouseEventType.CLICK)
{
Debug.Log("Clicked");
int targetIndex = System.Array.IndexOf(robotColliders, target);
Tun.transform.DORotate(Robots[targetIndex].transform.position, 2f, RotateMode.FastBeyond360).SetEase(Ease.Linear);
}
}
我正在考虑使用组件 DORotate(),但无论如何它都不起作用。有谁知道如何解决这个问题?
一种方法是使用四元数设置绕 z 轴的旋转,使用对象和箭头之间的矢量来获取角度。
Vector2 dir = Robots[targetIndex].transform.position - Tun.transform.position;
Tun.transform.rotation = Quaternion.Euler(0, 0, Mathf.atan2(dir.y, dir.x)*Mathf.Rad2Deg - 90); // may not need to offset by 90 degrees here;
对于这样一个简单的任务来说,移动部件太多了。 Unity 手册中有一个示例是执行此类操作的正确(最有效)方法(参见 https://docs.unity3d.com/ScriptReference/Mathf.Atan2.html):
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
public Transform target;
void Update() {
Vector3 relative = transform.InverseTransformPoint(target.position);
float angle = Mathf.Atan2(relative.x, relative.z) * Mathf.Rad2Deg;
transform.Rotate(0, angle, 0);
}
}
这通过绕 Y 轴旋转对象来操作(这就是 Atan2 考虑 X 和 Z 的原因):如果您需要不同的轴,只需更改这些轴即可调整代码。
我有一个问题。我在屏幕上有 4 个物体和一个弹丸,如下图所示。 image source
当我点击 4 射弹中的一个物体时,它会改变位置,指示我点击的物体。 这是使用的代码,但它不起作用。
public GameObject Tun;
public GameObject[] robotColliders;
public GameObject[] Robots;
foreach(GameObject coll in robotColliders)
{
coll.GetOrAddComponent<MouseEventSystem>().MouseEvent += SetGeometricFigure;
}
private void SetGeometricFigure(GameObject target, MouseEventType type)
{
if(type == MouseEventType.CLICK)
{
Debug.Log("Clicked");
int targetIndex = System.Array.IndexOf(robotColliders, target);
Tun.transform.DORotate(Robots[targetIndex].transform.position, 2f, RotateMode.FastBeyond360).SetEase(Ease.Linear);
}
}
我正在考虑使用组件 DORotate(),但无论如何它都不起作用。有谁知道如何解决这个问题?
一种方法是使用四元数设置绕 z 轴的旋转,使用对象和箭头之间的矢量来获取角度。
Vector2 dir = Robots[targetIndex].transform.position - Tun.transform.position;
Tun.transform.rotation = Quaternion.Euler(0, 0, Mathf.atan2(dir.y, dir.x)*Mathf.Rad2Deg - 90); // may not need to offset by 90 degrees here;
对于这样一个简单的任务来说,移动部件太多了。 Unity 手册中有一个示例是执行此类操作的正确(最有效)方法(参见 https://docs.unity3d.com/ScriptReference/Mathf.Atan2.html):
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
public Transform target;
void Update() {
Vector3 relative = transform.InverseTransformPoint(target.position);
float angle = Mathf.Atan2(relative.x, relative.z) * Mathf.Rad2Deg;
transform.Rotate(0, angle, 0);
}
}
这通过绕 Y 轴旋转对象来操作(这就是 Atan2 考虑 X 和 Z 的原因):如果您需要不同的轴,只需更改这些轴即可调整代码。