我正在尝试为我正在开发的游戏制作一个统一的半程序生成地图。在游戏中,当玩家向方形平台移动时,方形平台会在各个方向生成(北、南、东、西、西北、东北、西南、东南)。这些平台包含平坦的地形作为地面,因此我可以在它们上绘制纹理等等。为了给游戏带来一些多样性,我打算在这些平台生成时选择随机旋转(90、180 和 270 度)。
问题是,默认情况下,地形的枢轴点并不位于其中心,这会导致非常尴尬的情况,在这种情况下,会产生破坏性的结果。我尝试将其子化为一个中心轴为中心的空游戏对象,但得到了相同的结果。
有谁知道解决这个问题的方法吗?我知道这不完全是一个编码问题,但它仍然是一个技术问题。我已经四处搜索,常见的解决方案是将其子化为空,但正如我所说,它在这种情况下不起作用,除非我遗漏了一些东西。 一如既往,提前感谢您的耐心和关注。 鲁伊·皮雷斯
注: 这是我的轮换脚本,万一我可以通过修改它来实现一些目标:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AutoRotate : MonoBehaviour
{
Quaternion rot1;
private int a;
private void Awake()
{
a = Random.Range(0, 4);
rot1 = transform.rotation;
}
// Start is called before the first frame update
void Start()
{
switch(a)
{
case 0: transform.rotation = rot1;
Debug.Log("case 0");
break;
case 1: rot1 = Quaternion.AngleAxis(90, Vector3.up);
transform.rotation = rot1;
Debug.Log("case 1");
break;
case 2: rot1 = Quaternion.AngleAxis(180, Vector3.up);
transform.rotation = rot1;
Debug.Log("case 2");
break;
case 3:
rot1 = Quaternion.AngleAxis(270, Vector3.up);
transform.rotation = rot1;
Debug.Log("case 3");
break;
}
}
}
编辑:
我最终得到了一个“创可贴”解决方案,向地形添加 localPosition 值以纠正旋转行为:
Quaternion rot1;
private int a;
private void Awake()
{
a = Random.Range(0, 4);
rot1 = transform.rotation;
}
// Start is called before the first frame update
void Start()
{
switch(a)
{
case 0: transform.rotation = rot1;
Debug.Log("case 0");
break;
case 1: rot1 = Quaternion.AngleAxis(90, Vector3.up);
transform.rotation = rot1;
transform.GetChild(0).transform.localPosition = new Vector3(transform.GetChild(0).transform.localPosition.x + 100, transform.GetChild(0).transform.localPosition.y, transform.GetChild(0).transform.localPosition.z);
Debug.Log("case 1");
break;
case 2: rot1 = Quaternion.AngleAxis(180, Vector3.up);
transform.rotation = rot1;
transform.GetChild(0).transform.localPosition = new Vector3(transform.GetChild(0).transform.localPosition.x + 100, transform.GetChild(0).transform.localPosition.y, transform.GetChild(0).transform.localPosition.z +100);
Debug.Log("case 2");
break;
case 3:
rot1 = Quaternion.AngleAxis(270, Vector3.up);
transform.rotation = rot1;
transform.GetChild(0).transform.localPosition = new Vector3(transform.GetChild(0).transform.localPosition.x, transform.GetChild(0).transform.localPosition.y, transform.GetChild(0).transform.localPosition.z+100);
Debug.Log("case 3");
break;
}
}
注意:层次结构中的第一个子级(索引为 0 的子级)显然是地形游戏对象。