2016-07-10 1 views
0

Итак, моя проблема в том, что я хочу, чтобы мои объекты случайно перемещались в определенном круглом диапазоне с определенной скоростью. Прямо сейчас он движется очень быстро, и умножение его на скорость не работает.случайное перемещение в пределах круга

Вот мой код:

using UnityEngine; 
using System.Collections; 

public class RandomTargetMovement : MonoBehaviour { 
    public float radius = 20.0f; 

    void Update(){ 
     transform.position = Random.insideUnitCircle * radius; 
    } 
} 
+0

Ваш случайный разный каждый раз (я угадываю), поэтому, возможно, лучший подход состоял бы в том, чтобы установить случайную стартовую позицию, а затем назначить угловую скорость, которая заставит ее двигаться по кругу? –

+0

или просто выбрать случайную цель внутри круга, медленно продвигаясь к ней, а затем снова выбрать новую случайную цель – mgear

+0

https://unisalesianogames.files.wordpress.com/2011/08/programming-game-ai-by-example-mat- buckland2.pdf - очень хорошая книга по рулевому поведению. Глава 3 мне очень помогла. –

ответ

0

Это потому, что вы делаете новое случайное число в каждом обновлении. Это плохо по нескольким причинам.

Но в данном конкретном случае не только это плохо, но и просто не работает. Это потому, что обновление вызывается каждый раз, когда кадр визуализируется, и это означает, что у вас всегда будет рывкое движение, независимо от того, как вы установите скорость. Для этого вы должны использовать deltaTime.

Я предполагаю, что вы хотите, чтобы объект переместился в точку, затем начать движение к новой случайной точке. Вот не очень элегантное решение:

using UnityEngine; 
using System.Collections; 

public class TestSample : MonoBehaviour { 

    public float radius = 40.0f; 
    public float speed = 5.0f; 

    // The point we are going around in circles 
    private Vector2 basestartpoint; 

    // Destination of our current move 
    private Vector2 destination; 

    // Start of our current move 
    private Vector2 start; 

    // Current move's progress 
    private float progress = 0.0f; 

    // Use this for initialization 
    void Start() { 
     start = transform.localPosition; 
     basestartpoint = transform.localPosition; 
     progress = 0.0f; 

     PickNewRandomDestination(); 
    } 

    // Update is called once per frame 
    void Update() { 
     bool reached = false; 

     // Update our progress to our destination 
     progress += speed * Time.deltaTime; 

     // Check for the case when we overshoot or reach our destination 
     if (progress >= 1.0f) 
     { 
      progress = 1.0f; 
      reached = true; 
     } 

     // Update out position based on our start postion, destination and progress. 
     transform.localPosition = (destination * progress) + start * (1 - progress); 

     // If we have reached the destination, set it as the new start and pick a new random point. Reset the progress 
     if (reached) 
     { 
      start = destination; 
      PickNewRandomDestination(); 
      progress = 0.0f; 
     } 
    } 

    void PickNewRandomDestination() 
    { 
     // We add basestartpoint to the mix so that is doesn't go around a circle in the middle of the scene. 
     destination = Random.insideUnitCircle * radius + basestartpoint; 
    } 
} 

Надеюсь, это поможет.