2017-10-14 204 views
0
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class WallsTest : MonoBehaviour 
{ 
    // using a GameObject rather than a transform 
    public GameObject prefab; 
    public Vector3 wallsStartPosition; 
    public float width = 0; 
    public float height = 1; 
    public float length = 2; 
    public Camera wallsCamera; 
    public float wallsArea; 

    void Start() 
    { 
     wallsCamera.transform.position = new Vector3(wallsStartPosition.x, wallsStartPosition.y + 100, wallsStartPosition.z - 235); 

     BuildWalls(); 
    } 

    private void Update() 
    { 

    } 

    void BuildWalls() 
    { 
     for (int i = -2; i < 2; i++) 
     { 
      GameObject go = Instantiate(prefab); 
      go.transform.parent = transform; 
      Vector3 scale = Vector3.one; 
      Vector3 adjustedPosition = wallsStartPosition; 

      float sign = Mathf.Sign(i); 
      if ((i * sign) % 2 == 0) 
      { 
       adjustedPosition.x += (length * sign)/2; 
       scale.x = width; 
       scale.y = height; 
       scale.z *= length + width; 
      } 
      else 
      { 
       adjustedPosition.z += (length * sign)/2; 
       scale.x *= length + width; 
       scale.y = height; 
       scale.z = width; 
      } 

      adjustedPosition.y += height/2; 
      go.transform.localScale = scale; 
      go.transform.localPosition = adjustedPosition; 
     } 
    } 
} 

例如,長度爲100,所以我認爲面積將爲100x100。 而我有牆壁開始位置例如250,0,250我如何生成特定給定區域之間不重疊的隨機對象?

現在我想在牆面區域內實例化隨機位置的對象數量。例如50個立方體。但是它們不應該相互重疊,例如彼此之間的最小差距應該是5.並且最大差距應該是可能的。

但我還不明白如何計算牆的面積和位置,只是實例化裏面的隨機對象。

這是在給定區域隨機位置產生遊戲對象的腳本。在這種情況下,該區域是地形。但是我希望該區域位於我在第一個腳本中創建的牆內。該腳本附加到像WallsTest腳本一樣的空遊戲對象。

SpawnObjects腳本的另一個問題是,沒有任何對象之間的間隙設置,如果對象太好了,比如縮放比例爲20,20,20,那麼在邊緣上產生的一些對象會在地形外產生一半。

spawn

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class SpawnObjects : MonoBehaviour 
{ 
    public Terrain terrain; 
    public int numberOfObjects; // number of objects to place 
    private int currentObjects; // number of placed objects 
    public GameObject objectToPlace; // GameObject to place 
    private int terrainWidth; // terrain size (x) 
    private int terrainLength; // terrain size (z) 
    private int terrainPosX; // terrain position x 
    private int terrainPosZ; // terrain position z 
    void Start() 
    { 
     // terrain size x 
     terrainWidth = (int)terrain.terrainData.size.x; 
     // terrain size z 
     terrainLength = (int)terrain.terrainData.size.z; 
     // terrain x position 
     terrainPosX = (int)terrain.transform.position.x; 
     // terrain z position 
     terrainPosZ = (int)terrain.transform.position.z; 
    } 
    // Update is called once per frame 
    void Update() 
    { 
     // generate objects 
     if (currentObjects <= numberOfObjects) 
     { 
      // generate random x position 
      int posx = Random.Range(terrainPosX, terrainPosX + terrainWidth); 
      // generate random z position 
      int posz = Random.Range(terrainPosZ, terrainPosZ + terrainLength); 
      // get the terrain height at the random position 
      float posy = Terrain.activeTerrain.SampleHeight(new Vector3(posx, 0, posz)); 
      // create new gameObject on random position 
      GameObject newObject = (GameObject)Instantiate(objectToPlace, new Vector3(posx, posy, posz), Quaternion.identity); 
      newObject.transform.localScale = new Vector3(20, 20, 20); 
      currentObjects += 1; 
     } 
     if (currentObjects == numberOfObjects) 
     { 
      Debug.Log("Generate objects complete!"); 
     } 
    } 
} 

回答

0

我的技術知識是有限的,但你必須要麼拿到劇本產卵這些對象的每一個[X]的位置量(「POSX + = 1.0F;」,或)以便它們以統一的方式出現,或者讓腳本記錄每個新對象的位置並使用該信息計算離開所述對象以產生另一個對象的空間。

在任何情況下,根據最終導致你的目標爲,你必須寫這些對象在給定的空間是如何運作的。例如,如果你有一個凌亂的房間作爲場景,你可以有一張辦公桌,可以在兩面牆的角落裏找到空間,一面牆旁邊有一張牀,垃圾隨機產生。

0

您可以使用Physics.OverlapSphere來測試兩個對象是否重疊。這假定對象都有對撞機。

一旦測試這種情況下,它的計算結果爲真實的,我建議簡單地移動重疊的對象,並再次測試其對場景中的其他對象。您只需測試您認爲可能接近重疊或重疊的對象,就可以明白這一點。

或者,您可以將每個對象與場景中的每個其他對象進行比較。如果你有很多的對象,這將不是理想的,因爲這樣做會是複雜的。

在任何情況下,您都可以使用此功能來測試重疊。祝你好運。

提示:如果你不是對象做出更大的對撞機,你可以分開放置物品的最小空間。例如,如果你有localSize 1,1,1的立方體 - 在colider可以在尺寸5,5,5和Physics.OverlapSphere將返回true,如果對撞機重疊,要求立方體彼此

一定的空間間隔
相關問題