Unity3d 统一地形和轴心点旋转问题

Unity3d 统一地形和轴心点旋转问题,unity3d,rotation,unity3d-terrain,Unity3d,Rotation,Unity3d Terrain,我正在尝试为我正在开发的游戏制作一个关于unity的半程序生成的地图。在游戏中,当玩家向方形平台移动时(北、南、东、西、西北、东北、西北、东北、西南、东南、东南)。 这些平台包含一个平坦的地形作为地面(所以我可以在上面绘制纹理等等)。为了给游戏一些多样性,我打算在这些平台产卵时为它们选择一个随机旋转(90度、180度和270度)。问题是,默认情况下,地形的轴心点不在它的中心,这会导致非常尴尬的结果,在这种情况下,会造成破坏性的结果。我试图将其子对象化为一个中心有轴的空游戏对象,但得到了相同的结果

我正在尝试为我正在开发的游戏制作一个关于unity的半程序生成的地图。在游戏中,当玩家向方形平台移动时(北、南、东、西、西北、东北、西北、东北、西南、东南、东南)。 这些平台包含一个平坦的地形作为地面(所以我可以在上面绘制纹理等等)。为了给游戏一些多样性,我打算在这些平台产卵时为它们选择一个随机旋转(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;
        }
    }

    
}
编辑:添加了两幅图像以更好地描述问题。

我最终得到了一个“bandaid”解决方案,为地形添加了一个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的子级)显然是地形游戏对象。

我最终得到了一个“bandaid”解决方案,在地形中添加一个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的子对象)显然是地形游戏对象。

一些图片在这里会很有帮助。对不起,我不知道有人回答了这个问题。我现在在我的手机上,有机会我会上传一些照片。谢谢。图片添加完毕。等待答复。提前谢谢你。我觉得你应该能够将它设置为空游戏对象的父对象。您是否尝试过切换枢轴模式(在移动/旋转/缩放控件之后,它位于屏幕左上角)。是和是。我两个都试过了,行为都是一样的。它仍然围绕拐角处的枢轴旋转,而不是围绕中心旋转。一些图片在这里会非常有用。对不起,我不知道有人回答了这个问题。我现在在我的手机上,有机会我会上传一些照片。谢谢。图片添加完毕。等待答复。提前谢谢你。我觉得你应该能够将它设置为空游戏对象的父对象。您是否尝试过切换枢轴模式(在移动/旋转/缩放控件之后,它位于屏幕左上角)。是和是。我两个都试过了,行为都是一样的。它仍然围绕拐角处的枢轴旋转,而不是围绕中心旋转。