我正在研究塔防游戏的原型,并且遇到了炮塔旋转的问题。我这样做是为了使每个炮塔都必须有一个 rotor 零件,该零件会水平旋转 并保持炮塔主体和大炮 strong>垂直旋转 。我想出了一个简单的脚本,但是它似乎只对 rotator 有用,而对 cannon 无效,至少不是这样。
这是脚本中的 code :
void Update () {
if (target != null) {
Vector3 tempRotatorRotation = rotator.transform.localEulerAngles;
rotator.transform.LookAt (target.transform);
rotator.transform.localEulerAngles = new Vector3 (tempRotatorRotation.x, rotator.transform.localEulerAngles.y, tempRotatorRotation.z);
Vector3 tempCannonRotation = cannon.transform.localEulerAngles;
cannon.transform.LookAt (target.transform);
cannon.transform.localEulerAngles = new Vector3 (cannon.transform.localEulerAngles.x, tempCannonRotation.y, tempCannonRotation.z);
}
}
这是结果的图像。 旋转器已完美旋转,但正如您所见,大炮由于某种原因而向下看。 (蓝色是不动的基座。绿色是旋转器。红色是炮塔体。浅蓝色是大炮)
答案 0 :(得分:1)
forward
统一为蓝线,在您的图表中该蓝线朝上。试试这个
板条箱为空,将其安装在转塔上以使其旋转,并确保蓝线(z轴)面向您的前进方向,您可以通过旋转手动进行此操作。然后将桶作为该对象的子对象,然后将该对象指向目标。
iveve必须对Blender模型进行多次操作,因为Blender使用z轴作为垂直轴,而不是像unity那样使用深度轴。
-turret_test
-turret_test_pedestal
-turret_test_rotater
-turret_test_turret
-AIM(new empty, orient the proper direction then add child)
-turret_test_cannon
答案 1 :(得分:0)
您的大炮的枪管指向其forward
方向,因此您只需使用cannon.transform.LookAt (target.transform, cannon.transform.up);
void Update () {
if (target != null) {
/* rotator code here */
// Remember which way the top of the cannon faces.
Vector3 cannonUpDirection = cannon.transform.up;
// point the cannon directly at the target
cannon.transform.LookAt (target.transform, cannonUpDirection);
}
}
如果旋转器没有指向目标/在目标上方/下方,那么您必须计算出将佳能从水平方向向上/向下旋转多少,然后将其指向与旋转器相同的方向,然后执行
void Update () {
if (target != null) {
/* rotator code here */
// Remember which way the top of the cannon faces.
Vector3 cannonUpDirection = cannon.transform.up;
// point the cannon directly at the target
cannon.transform.LookAt (target.transform, cannonUpDirection);
// Find global direction for looking straight ahead above/below the target
Vector3 sameYDirection = Vector3.Scale(
cannon.transform.forward,
new Vector3(1f,0f,1f)
);
// Convert that to local
Vector3 sameYDirectionLocal = cannon.transform
.InverseTransformDirection(sameYDirection);
// get rotation for moving from looking ahead to looking direct
Quaternion lookTowards = Quaternion.FromToRotation(
sameYDirectionLocal,
Vector3.forward
);
// lookTowards is a locally-vertical rotation from horizontal to the target,
// given some top side of the cannon.
// Clamp lookTowards here if you have a max rotation speed.
// Face cannon in same direction of rotator;
cannon.transform.rotation = Quaternion.LookRotation(
rotator.forward, cannonUpDirection);
// Use lookTowards to look down from that position.
cannon.transform.rotation *= lookTowards;
}
}
答案 2 :(得分:-2)
结果证明Unity已损坏,当我重新导入模型时,所有轴都发生了变化,现在不再是经典的在X轴上上下旋转,而是在Y轴上,而其他所有东西都在Y方向上水平旋转。 / p>
在计算中,我还必须在两个方程式中加上+ 90。现在这已经没有意义了,因为它表明两者都在Y轴上发生变化,但是一个在水平方向旋转而另一个在垂直方向旋转。
if (target != null) {
Vector3 tempRotatorRotation = rotator.transform.localEulerAngles;
rotator.transform.LookAt (target.transform);
rotator.transform.localEulerAngles = new Vector3 (tempRotatorRotation.x, rotator.transform.localEulerAngles.y + 90, tempRotatorRotation.z);
Vector3 tempCanonRotation = canon.transform.localEulerAngles;
canon.transform.LookAt (target.transform);
canon.transform.localEulerAngles = new Vector3 (tempCanonRotation.x, canon.transform.localEulerAngles.y + 90, tempCanonRotation.z);
}