Unity 地形和枢轴点旋转问题

问题描述 投票:0回答:1

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

    
}

编辑:

添加几张图像以更好地描述问题。

unity-game-engine rotation unity3d-terrain
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.