2017-10-14 114 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,如果对撞机重叠,要求立方体彼此

一定的空间间隔
相关问题