2016-05-04 3 views
2

Как создать время как расстояние между двумя объектами?Создание расстояния во времени между объектами единства

У меня есть игрок и объект, который должен прибыть к игроку со скоростью 1 секунда, 0,85 секунды, 0,7 секунды и так далее. Однако я не знаю об этом. У меня есть двигающаяся 2D карты со скоростью -4, чтобы дать иллюзию бега вверх: enter image description here

Красный треугольник на картинке объект, который нуждается прийти к игроку, он также имеет скорость -4 , Я создал это движение с помощью Time.deltaTime, поэтому я работал бы в реальном времени. С этой логикой я полагал, что мне пришлось отложить объект 4F от игрока, чтобы создать 1-секундный интервал (желаемая секундная скорость * скорость).

PlayerScript

using UnityEngine; 
using System.Collections; 

public class PlayerScript : MonoBehaviour { 

    public GameObject obstacle; 
    public GameObject player; 

    public float playerDimensionY; 

    public bool isRight = true; 
    public bool inAir = false; 
    public bool mouseClicked = false; 

    public int flyingSpeed; 

    float timeStamp1; 
    float timeStamp2; 

    bool runOnce = false; 

    // Use this for initialization 
    void Start() { 
     Vector2 sprite_size = GetComponent<SpriteRenderer>().sprite.rect.size; 
     Vector2 spriteScale = transform.localScale; 

     float sizeAndScaleY = sprite_size.y * spriteScale.y; 

     float player_local_sprite_sizeY = (sizeAndScaleY/GetComponent<SpriteRenderer>().sprite.pixelsPerUnit) * 0.5F; 

     playerDimensionY = player_local_sprite_sizeY; 
    } 


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

     if (isRight == true && mouseClicked == true) { 
      transform.position += Vector3.right * flyingSpeed * Time.deltaTime; 
     } else if (isRight == false && mouseClicked == true) { 
      transform.position += Vector3.left * flyingSpeed * Time.deltaTime; 
     } 

     if (Input.GetMouseButtonDown (0) && inAir == false) { 
      mouseClicked = true; 
      inAir = true; 

      if (isRight == true) { 
       isRight = false; 
      } else if (isRight == false) { 
       isRight = true; 
      } 
     } 

     if (GameObject.FindWithTag ("Obstacle") != null && runOnce == false) { 
      Debug.Log (string.Format("Spawn time: " + timeStamp1)); 
      runOnce = true; 
     } 

     timeStamp1 = Time.fixedTime; 
     timeStamp2 = Time.fixedTime; 
    } 

    void OnCollisionEnter2D(Collision2D coll) { 
     inAir = false; 
     mouseClicked = false; 
    } 

    void OnTriggerEnter2D(Collider2D collTrig) { 
     Debug.Log (string.Format ("Trigger time: " + timeStamp2)); 
    } 
} 

ObstacleScript:

using UnityEngine; 
using System.Collections; 

public class ObstacleScript : MonoBehaviour { 

    public float constantSpeed; 
    public float destroyTime; 
    public float obstacleDimensionY; 

    private float selfDestroyTime; 

    // Use this for initialization 
    void Awake() { 
     selfDestroyTime = Time.time + destroyTime; 
    } 

    void Start() { 
     Vector2 sprite_size = GetComponent<SpriteRenderer>().sprite.rect.size; 
     Vector2 spriteScale = transform.localScale; 

     float sizeAndScaleY = sprite_size.y * spriteScale.y; 

     float obstacle_local_sprite_sizeY = (sizeAndScaleY/GetComponent<SpriteRenderer>().sprite.pixelsPerUnit) * 0.5F; 

     obstacleDimensionY = obstacle_local_sprite_sizeY; 
    } 

    // Update is called once per frame 
    void Update() { 
     transform.position += Vector3.up * constantSpeed * Time.deltaTime; 

     if (Time.time > selfDestroyTime) { 
      Destroy (gameObject); 
     } 
    } 
} 

ObstacleSpawn:

using UnityEngine; 
using System.Collections; 

public class ObstacleSpawn : MonoBehaviour { 

    public PlayerScript pScript; 
    public ObstacleScript oScript; 

    public GameObject player; 
    public GameObject obstacle; 

    public float randomSpawnMin; 
    public float randomSpawnMax; 

    // Use this for initialization 
    void Start() { 
     InvokeRepeating ("Spawn", 2F, Random.Range (randomSpawnMin, randomSpawnMax)); 
    } 

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

    } 

    void Spawn() { 
     if (pScript.isRight == true && pScript.inAir == false) { 
      obstacle.transform.localScale = new Vector3 (-1, 1, 1); 
      Instantiate (obstacle, player.transform.position + new Vector3 (0.05F, 4F, 0), Quaternion.identity); 
     } else if (pScript.isRight == false && pScript.inAir == false) { 
      obstacle.transform.localScale = new Vector3 (1, 1, 1); 
      Instantiate (obstacle, player.transform.position + new Vector3 (-0.05F, 4F, 0), Quaternion.identity); 
     } 
    } 
} 

Однако, используя метки времени между препятствиями икре и запуская с характером, я получил результат 0,5 интервал вместо 1. Из-за этого я последовал за попыткой сделать его 8F в вместо 4F, что должно привести к моему 1-секундному интервалу, но это удивительно дало 0,86-интервал.

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

С уважением.

EDIT - Добавлен код:

using UnityEngine; 
using System.Collections; 

public class ObstacleSpawn : MonoBehaviour { 

    public PlayerScript pScript; 
    public ObstacleScript oScript; 

    public GameObject player; 
    public GameObject obstacle; 

    public float randomSpawnMin; 
    public float randomSpawnMax; 

    // Use this for initialization 
    void Start() { 
     InvokeRepeating ("Spawn", 2F, Random.Range (randomSpawnMin, randomSpawnMax)); 
    } 

    // Update is called once per frame 
    void Update() { 
     var diff = (player.transform.position - obstacle.transform.position); 
     diff = diff.normalized; 
     Vector3 speed = new Vector3 (100 * Time.deltaTime, 100 * Time.deltaTime, 100 * Time.deltaTime); 
     diff.x *= speed.x; 
     diff.y *= speed.y; 
     diff.z *= speed.z; 
     obstacle.transform.position = obstacle.transform.position + diff; 

    } 

    void Spawn() { 
     if (pScript.isRight == true && pScript.inAir == false) { 
      obstacle.transform.localScale = new Vector3 (-1, 1, 1); 
      Instantiate (obstacle, obstacle.transform.position, Quaternion.identity); 
     } else if (pScript.isRight == false && pScript.inAir == false) { 
      obstacle.transform.localScale = new Vector3 (1, 1, 1); 
      Instantiate (obstacle, obstacle.transform.position, Quaternion.identity); 
     } 
    } 
} 

ответ

2
var diff = (Player.transform.position - RedTriangle.transform.position ); 
diff = diff.normalized; 
var speed = Vector3(1*Time.deltaTime,1*Time.deltaTime,1*Time.deltaTime); // <- speed 
diff.x *= speed.x; 
diff.y *= speed.y; 
diff.z *= speed.z;  
RedTriangle.transform.position = RedTriangle.transform.position + diff; 

Что-то вроде этого нужно пойти в обновлении скрипта. (он переместит треугольник к игроку)

+0

Спасибо за ваш ответ, не могли бы вы рассказать, чтобы дать мне понимание? – WONDERGG

+0

Мне нужно, чтобы вы это уточнили - как я могу использовать этот кусок кода и где его поместить? В настоящее время я попытался поместить его в скрипт ObstacleSpawn в функции Start(), но я получаю сообщение об ошибке: Assets/Scripts/ObstacleSpawn.cs (21,29): ошибка CS0019: Оператор '* 'не может применяться к операндам типа' UnityEngine.Vector3 'и 'UnityEngine.Vector3' – WONDERGG

+0

Hi WONDEREGG - Код был всего лишь примером, я забыл, что Unity не поддерживает умножение двух векторов. вам нужно умножить .x, .y, .z - код необходимо поместить в «Обновление». – Chris

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