Unity C#/Blender 模型旋转不正确
Unity C#/Blender Model not rotating correctly
所以我在搅拌机中创建了一个 turrent 模型并导入到 unity 中一切看起来都很好我为我的中心场景组合了一个小旋转脚本并且旋转效果很好
现在进入尝试旋转枪管以看向敌人的代码看起来不太好
这里有一个简短的游戏视频来演示这个问题
turrent 的桶正面临一个与敌人完全不同的地方我更愿意在代码中解决这个问题而不是从头开始重建模型所以这就是我目前正在做的事情(那是行不通的)
private void Update(){
FlameForgedTime.UpdateTime ();
if (isInGame) {
RegenerateHitpoint ();
//Look for enemy
if (FlameForgedTime.Time - lastAttack > StatsHelper.Instance.GetStatValue (Stat.Speed)) {
Collider[] col = Physics.OverlapSphere(transform.position,StatsHelper.Instance.GetStatValue (Stat.Range),LayerMask.GetMask("Enemy"));
if (col.Length != 0) {
//find closest enemy
int closestIndex = 0;
float dist = Vector3.SqrMagnitude (col [closestIndex].transform.position - transform.position);
for (int i = 1; i < col.Length; i++) {
float newDistance = Vector3.SqrMagnitude (col [i].transform.position - transform.position);
if (newDistance < dist) {
dist = newDistance;
closestIndex = i;
}
}
//shoot enemy
//Rotate turrent to look at enemy GameObject.FindGameObjectWithTag("Player").transform.LookAt(col[closestIndex].transform);
ShootEnemy(col[closestIndex].transform);
lastAttack = Time.time;
}
}
}
}
所以在我的 turrent(父游戏对象)上我有标签 "Player" 因为 turrent 是在预加载器场景中加载的并且无法通过 public GameObject 字段访问
出于某种原因,Y 轴是电流旋转的轴
无论如何,我找到离塔最近的敌人,然后做一个 LookAt 尝试让炮塔看向敌人,然后向敌人射击,但是正如您在视频中看到的那样,它无法正常工作
您模型上的 "forward" 轴(即枪管指向的方向)与 Unity 所说的前轴不一致。
"Forward" 在 Unity 中是沿正 Z 方向,因此您的模型与其变换的局部前向不对齐(这是使用 LookAt()
时指向事物的方向)。看起来您的模型是沿着正 X 轴向前对齐的。
可以通过三种方法解决此问题:
- 在 Blender 中旋转它并重新导出(最佳选择)
- 创建一个空的父游戏对象,"becomes" 枪对象(也就是说,所有引用都指向这个新对象,任何脚本从它们现在所在的位置移动到这里,等等),但是你把当前对象内部并将 now-child 变换旋转 90 度。有时也称为 "recentering"。对于不属于您的资产,这有时是唯一的选择。
- 执行
LookAt()
(不推荐)后按脚本旋转 90 度
所以我在搅拌机中创建了一个 turrent 模型并导入到 unity 中一切看起来都很好我为我的中心场景组合了一个小旋转脚本并且旋转效果很好
现在进入尝试旋转枪管以看向敌人的代码看起来不太好
这里有一个简短的游戏视频来演示这个问题
turrent 的桶正面临一个与敌人完全不同的地方我更愿意在代码中解决这个问题而不是从头开始重建模型所以这就是我目前正在做的事情(那是行不通的)
private void Update(){
FlameForgedTime.UpdateTime ();
if (isInGame) {
RegenerateHitpoint ();
//Look for enemy
if (FlameForgedTime.Time - lastAttack > StatsHelper.Instance.GetStatValue (Stat.Speed)) {
Collider[] col = Physics.OverlapSphere(transform.position,StatsHelper.Instance.GetStatValue (Stat.Range),LayerMask.GetMask("Enemy"));
if (col.Length != 0) {
//find closest enemy
int closestIndex = 0;
float dist = Vector3.SqrMagnitude (col [closestIndex].transform.position - transform.position);
for (int i = 1; i < col.Length; i++) {
float newDistance = Vector3.SqrMagnitude (col [i].transform.position - transform.position);
if (newDistance < dist) {
dist = newDistance;
closestIndex = i;
}
}
//shoot enemy
//Rotate turrent to look at enemy GameObject.FindGameObjectWithTag("Player").transform.LookAt(col[closestIndex].transform);
ShootEnemy(col[closestIndex].transform);
lastAttack = Time.time;
}
}
}
}
所以在我的 turrent(父游戏对象)上我有标签 "Player" 因为 turrent 是在预加载器场景中加载的并且无法通过 public GameObject 字段访问
出于某种原因,Y 轴是电流旋转的轴
无论如何,我找到离塔最近的敌人,然后做一个 LookAt 尝试让炮塔看向敌人,然后向敌人射击,但是正如您在视频中看到的那样,它无法正常工作
您模型上的 "forward" 轴(即枪管指向的方向)与 Unity 所说的前轴不一致。
"Forward" 在 Unity 中是沿正 Z 方向,因此您的模型与其变换的局部前向不对齐(这是使用 LookAt()
时指向事物的方向)。看起来您的模型是沿着正 X 轴向前对齐的。
可以通过三种方法解决此问题:
- 在 Blender 中旋转它并重新导出(最佳选择)
- 创建一个空的父游戏对象,"becomes" 枪对象(也就是说,所有引用都指向这个新对象,任何脚本从它们现在所在的位置移动到这里,等等),但是你把当前对象内部并将 now-child 变换旋转 90 度。有时也称为 "recentering"。对于不属于您的资产,这有时是唯一的选择。
- 执行
LookAt()
(不推荐)后按脚本旋转 90 度