脚本的想法是在随机位置创建随机数量的球体。 现在我尝试使用Size参数并解决了它的所有问题。 我也想稍后让尺寸参数随机。但首先我无法弄清楚大小的变化。
c#中的脚本:
using System;
using UnityEngine;
using Random = UnityEngine.Random;
[ExecuteInEditMode]
public class SphereBuilder : MonoBehaviour
{
// for tracking properties change
private Vector3 _extents;
private int _sphereCount;
private float _sphereSize;
/// <summary>
/// How far to place spheres randomly.
/// </summary>
public Vector3 Extents;
/// <summary>
/// How many spheres wanted.
/// </summary>
public int SphereCount;
public float SphereSize;
private void OnValidate()
{
// prevent wrong values to be entered
Extents = new Vector3(Mathf.Max(0.0f, Extents.x), Mathf.Max(0.0f, Extents.y), Mathf.Max(0.0f, Extents.z));
SphereCount = Mathf.Max(0, SphereCount);
SphereSize = Mathf.Max(0.0f, SphereSize);
}
private void Reset()
{
Extents = new Vector3(250.0f, 20.0f, 250.0f);
SphereCount = 100;
SphereSize = 20.0f;
}
private void Update()
{
UpdateSpheres();
}
private void UpdateSpheres()
{
if (Extents == _extents && SphereCount == _sphereCount && Mathf.Approximately(SphereSize, _sphereSize))
return;
// cleanup
var spheres = GameObject.FindGameObjectsWithTag("Sphere");
foreach (var t in spheres)
{
if (Application.isEditor)
{
DestroyImmediate(t);
}
else
{
Destroy(t);
}
}
var withTag = GameObject.FindWithTag("Terrain");
if (withTag == null)
throw new InvalidOperationException("Terrain not found");
for (var i = 0; i < SphereCount; i++)
{
var o = GameObject.CreatePrimitive(PrimitiveType.Sphere);
o.tag = "Sphere";
o.transform.localScale = new Vector3(SphereSize, SphereSize, SphereSize);
// get random position
var x = Random.Range(-Extents.x, Extents.x);
var y = Extents.y; // sphere altitude relative to terrain below
var z = Random.Range(-Extents.z, Extents.z);
// now send a ray down terrain to adjust Y according terrain below
var height = 10000.0f; // should be higher than highest terrain altitude
var origin = new Vector3(x, height, z);
var ray = new Ray(origin, Vector3.down);
RaycastHit hit;
var maxDistance = 20000.0f;
var nameToLayer = LayerMask.NameToLayer("Terrain");
var layerMask = 1 << nameToLayer;
if (Physics.Raycast(ray, out hit, maxDistance, layerMask))
{
var distance = hit.distance;
y = height - distance + y; // adjust
}
else
{
Debug.LogWarning("Terrain not hit, using default height !");
}
// place !
o.transform.position = new Vector3(x, y, z);
}
_extents = Extents;
_sphereCount = SphereCount;
_sphereSize = SphereSize;
}
}
我添加了Tag Terrain并添加了Tag Sphere。并添加了一个Layer Terrain。 我看到,一旦我向Hierarchy添加了一个新的Terrain,它就会自动在它上面创建Spheres,大小为20。
我还没有将剧本拖到地形。
现在我将脚本拖到Terrain,我将size参数从20更改为70.一旦我将其更改为70,我在编辑器中看到,在运行游戏之前,球体大小已更改为70.
但是当我运行游戏时,球体的大小是20。 当我停止游戏并查看地形检查器时,我看到脚本中的参数大小为70,但现在我看到大小为20的球体,当运行游戏时它们的大小为20而不是70。
编辑器的屏幕截图可以看到球体的大小为20,但在右下角,脚本的大小参数设置为70:
第一次输入70时,球体变为70号,但在运行游戏时它的大小为20,当游戏停止时,除了脚本中的参数显示70之外,它都是20个大小。
我无法弄清楚为什么我无法更改尺寸参数。 在此之前,即使我将size参数更改为20,它仍然是70的所有时间。
我尝试使用断点调试我在脚本方面没有看到任何特殊的东西。如果大小是20,那么它一直是20。奇怪。