在运行时建造/建造建筑物

时间:2014-02-17 19:20:58

标签: unity3d

我正在玩FPS,我希望我的玩家能够从头开始构建/建造他们自己的建筑物。我一直在寻找现有的解决方案/理论,但到目前为止还没有找到适合我需求的东西。如果我遗漏了任何东西,请指出正确的方向。

我现在的位置是我有三个预制件;地板,墙壁和门打开。首先,我想要实例化地砖,然后我可以将墙壁放在墙上,并希望能够让墙壁与地砖的边缘/角落对齐。

任何人都可以指出我正确的方向如何做到这一点?另外,我想要的“工作流程”是否有意义?那里有任何陷阱吗?

提前致谢!

更新:这是我在实例化预制件方面所拥有的,虽然这有效(除了它就像我正在拍摄墙壁),我希望墙壁能够突然移动到角落/边缘。最近的楼层(已经以同样的方式实例化了。

[RequireComponent (typeof (CharacterController))]
public class PlayerController : MonoBehaviour {

// Declare prefabs here
GameObject wallPrefab;

// Initialise variables before the game starts
void Awake () {
    wallPrefab = (GameObject)Resources.Load( "WoodWall" );
}

// This happens every frame
void Update () {

    if ( Input.GetButtonDown("Fire1") ) {
        // Instantiate new wall
        Instantiate( wallPrefab, cc.transform.position + cc.transform.forward + Vector3.up * 1.0f, wallPrefab.transform.rotation );
    }

}

}

1 个答案:

答案 0 :(得分:0)

嗯......我能想到的一个解决方案就是让墙壁射线向下以找到一个地板,然后移动到相对于该地板的预定位置(如果发现任何地板)。将它贴在墙上预制件的脚本中:

void Start()
{
    var down = transform.TransformDirection (Vector3.down); //down might not actually be the down direction of your object, check to make sure
    RaycastHit hit;
    if (Physics.Raycast(transform.position, down, out hit) && hit.collider.gameObject.name == "myFloorName")  //Maybe use tags here instead of name
    {
        Vector3 floorPos = hit.collider.gameObject.transform.position;
        Vector3 floorSize = hit.collider.gameObject.transform.localScale;
        this.transform.position = new Vector3(floorPos.x - floorSize.x/2, floorPos.y - this.tranform.localScale.y/2, floorPos.z); //These might need fiddling with to get right
    }
}

void Update()
{
}

Vector3.down可能与墙的向下方向不对应,因为这也取决于3d模型,因此您可能需要摆弄它。该位置可能还需要摆弄(这假设y对应于高度,可能不是这种情况),但希望这能让您大致了解如何完成。此外,如果您不知道楼层对象的名称是什么,您可以通过标签进行检查,这可能更容易。

如果还有其他需要澄清的话,请留言,我会回复你