2014-02-17 38 views
0

我正在玩FPS,希望我的玩家能夠從頭開始構建/構建自己的建築物。我搜尋了現有的解決方案/理論,但到目前爲止還找不到適合我需求的任何東西。如果我錯過了任何事情,請指向正確的方向。在運行時建造/構建建築物

我現在在哪裏是我有三個預製件;地板,牆壁和開門的牆。首先,我想實例化地磚,然後我可以放上牆,並希望能夠將牆貼到地磚的邊緣/角落。

任何人都可以請指出我在正確的方向如何做到這一點?另外,我所希望的「工作流程」是否有意義?那裏有什麼陷阱?

在此先感謝!

UPDATE:這裏是我的問候實例預製件,雖然這工作(除了它就像我拍牆),我想在牆上捕捉到的角落/最近的樓層的邊緣(已經被實例化以同樣的方式。

[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); 
    } 

} 

}

+2

那麼究竟是什麼原因卡住了?你顯然知道prefabs,你似乎知道如何[實例化](http://docs.unity3d.com/Documentation/Manual/InstantiatingPrefabs.html)。 –

+0

我加了我現在的代碼。我不知道爲什麼頂部/底部不是語法突出部分的一部分,但... – toreau

回答

0

嗯......好一個解決方案,我能想到的,是有牆,以便向下光線投射找到地板,然後移動到相對於該樓層的預定位置(如果發現了),將其粘貼在牆上prefa的腳本中BS:

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對應於高度,但情況可能並非如此),但希望這會給你一個關於如何完成的粗略想法。另外,如果您不知道地板對象的名稱是什麼,則可以通過標籤進行檢查,這可能更容易。

如果還有其他問題需要澄清,請發表評論,我會盡快給您回覆

+0

我下班回家時會試試這個。與此同時,您是否願意在如何正確管理我的控制器方面給我啓發?在這種情況下,將所有這些構建功能放入一個ConstructionController並將其附加到用戶,還是有其他更好的方法來組織它是否合理? – toreau

+0

在這種情況下,上面的腳本會進入牆壁預製件。它在實例化時運行一次代碼,並且不需要在之後再次運行。至於附加到用戶的東西,將其分離成對您有意義的東西。例如,將所有用戶相關的構造放在用戶的腳本中,意味着您不需要稍後再去尋找哪一行代碼是(我必須做的事情......並且它並不好玩:P) –

+0

這對我已有的東西沒有什麼影響,但我現在更瞭解事情的工作原理。不過,仍然不確定如何捕捉到另一個對象的邊角。 – toreau