2016-08-30 8 views
-1

Я хочу, чтобы это было сделано как в редакторе, так и при запуске игры, чтобы увидеть все сферы в одно и то же время, перемещаясь в другое направление, или, может быть, это будет одно и то же направление до конца, а затем обратно в startPoint в цикле никто не останавливается.Как я могу перенести все сферы на местности с исходных позиций на новые позиции и вернуться к оригиналу в цикле?

Это мой сценарий:

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

Update

Я создал еще один сценарий с # и потащил его к местности.

using UnityEngine; 
using System.Collections; 

public class MoveSpheres : MonoBehaviour { 

    public Transform _transform; 
    private Vector3 pos1 = new Vector3(-4,0,0); 
    private Vector3 pos2 = new Vector3(4,0,0); 
    public float speed = 1.0f; 
    // Use this for initialization 
    void Start() { 



    } 

    // Update is called once per frame 
    void Update() { 

     _transform.position = Vector3.Lerp (pos1, pos2, Mathf.PingPong(Time.time*speed, 1.0f)); 


    } 
} 

Этот сценарий перемещает одну сферу. Но я хочу переместить все сферы. А также, если я изменяю в первом скрипте число Сфер, а затем перемещаю их, тоже продолжайте их перемещать.

Проблема с частью Destroy в первом скрипте.

+0

Помимо оригинальных вопросов есть несколько код запахов вы хотите, чтобы избавиться: это '' ExecuteInEditMode'' действительно необходима? Зачем искать все объекты (даже на основе их корневого имени), когда вы можете добавить общедоступную переменную? Вы можете получить все объектные преобразования, а не весь объект (это говорит о том, что это практически не имеет значения). Кроме того, вы можете захотеть привязать движущийся скрипт к объекту, а не делать все преобразования в одном цикле (который лучше оптимизирует компилятор моно/единицы), а также единство, похоже, приводит к проблемам производительности с очень длинными циклами в течение одного обновления одного объекта –

ответ

0

вы можете Lerp сферы из одного положения в другое и обратно https://docs.unity3d.com/ScriptReference/Vector3.Lerp.html

+0

Он работает, но только если я не удаляю уничтожение в другом скрипте. Уничтожить просто уничтожить сферу и заставить ее пропускать преобразование в новом скрипте. Даже если я добавлю новую сферу игрового объекта, которая не связана с моим другим скриптом. –

+1

О'кей, расслабься, мы можем это исправить, но ... Одну вещь за раз, я хочу, чтобы ты прекратил разрушать сферу на данный момент. Скажи мне, когда ты хочешь уничтожить сферу? Пока она двигалась или когда она перестала двигаться? – LumbusterTick

+0

Извините. Я хочу уничтожить сферы только тогда, когда я меняю число счетчиков сфер. Например, если я изменяю количество сфер на 1, уничтожаю другие сферы и создаю 1 новый. Если я установил 10 с pheres уничтожают 1 и создают новые 10 сфер. Это строка DestroyImmediate (t); в моем сценарии. Но мне сказали использовать Destroy вместо DestroyImmediate, но Destroy не сделать то, что я хочу. –

 Смежные вопросы

  • Нет связанных вопросов^_^