2017-02-17 15 views
0

Должен ли я использовать StartCoroutine?Как я могу перемещать объект вверх и назад?

using UnityEngine; 
using System.Collections; 
using System.Reflection; 

public class DetectPlayer : MonoBehaviour { 

    GameObject target; 
    int counter = 0; 
    public static bool touched = false; 

    public float moveSpeed = 3.0f; 
    public float smooth = 1f; 
    private float distanceTravelled; 
    private Vector3 startPositon; 
    public float distanceToTravel = 50; 

    private void Start() 
    { 
     startPositon = new Vector3(target.transform.position.x, target.transform.position.y, target.transform.position.z); 
    } 

    private void Update() 
    { 
     if (RaiseWalls.raised == true && touched == true) 
     { 
      MoveElevator(); 
      //touched = false; 
     } 
    } 

    void OnCollisionEnter(Collision collision) 
    { 
     if (collision.gameObject.name == "ThirdPersonController") // "Platform" 
     { 
      Debug.Log("Touching Platform"); 
     }   
    } 

    void OnTriggerEnter(Collider other) 
    { 
     if (other.gameObject.name == "ThirdPersonController") // "OnTop Detector" 
     { 
      counter = 0; 
      Debug.Log("On Top of Platform"); 
      target = GameObject.Find("Elevator"); 
      GameObject findGo = GameObject.Find("ThirdPersonController"); 
      GameObject findGo1 = GameObject.Find("Elevator"); 
      findGo.transform.parent = findGo1.transform; 

      GameObject go = GameObject.Find("CubeToRaise"); 
      go.GetComponent<RaiseWalls>(); 
      Debug.Log("The button clicked, raising the wall"); 
      touched = true; 
     } 
    } 

    void OnTriggerExit(Collider other) 
    { 
     GameObject findGo = GameObject.Find("ThirdPersonController"); 
     findGo.transform.parent = null; 
    } 

    void MoveElevator() 
    { 
     if (distanceTravelled == distanceToTravel) 
     { 

     } 
     else 
     { 
      target.transform.localPosition += target.transform.up * Time.deltaTime * moveSpeed; 
      distanceTravelled += Vector3.Distance(target.transform.position, startPositon); 
     } 
    } 
} 

В этом случае лифт в функции MoveElvator перемещается вверх. Теперь я хочу сделать это, когда он достигнет высоты 50, чтобы начать движение вниз и остановиться при обнаружении/получении на земле.

Так я добавил

if (distanceTravelled == distanceToTravel) 
      { 

      } 

Но не знаю, как заставить его двигаться вниз и остановится при получении на землю.

+1

Это C# не unityscript. Кстати, вы не получаете ответы, потому что трудно понять вашу проблему. «Теперь я хочу сделать это, когда он достигнет высоты 50, чтобы начать движение назад и остановиться, когда обнаруживается/попадает на землю». Где вы обнаруживаете, если он находится на земле? – Programmer

+0

Кстати, ваше пройденное расстояние неверно, потому что вы добавляете общее расстояние, пройденное к нему в каждом кадре. Вы должны просто иметь: 'distanceTravelled = Vector3.Distance (target.transform.position, startPositon);' – FINDarkside

ответ

0

Вам нужно сохранить какое-то состояние, поднимается ли лифт вверх или вниз. Вы можете использовать для перечислений, что:

enum State{ 
    Idle, 
    MovingUp, 
    MovingDown 
} 

Теперь вы просто осуществить перемещение вниз и изменить направление, когда вы находитесь в верхней или в нижней части.

0

Вот мой сценарий, который я использую:

float distance = 50; 
float oneWayDuration; 

void Start() { 
    StartCoroutine(Mover(oneWayDuration, distance)); 
} 

IEnumerator Mover(float oneWayDuration, float yDifference) 
{ 
    Vector3 startPos = transform.position; 
    Vector3 desirePos = new Vector3(startPos.x, startPos.y + 50 , startPos.z); 
    float timeElapsed = 0f; 

    while (timeElapsed < oneWayDuration) 
    { 
     timeElapsed += Time.deltaTime; 
     transform.position = Vector3.Lerp(startPos, desirePos, timeElapsed/oneWayDuration); 
     yield return new WaitForEndOfFrame(); 
    } 
    while (timeElapsed < oneWayDuration) 
    { 
     timeElapsed += Time.deltaTime; 
     transform.position = Vector3.Lerp(desirePos, startPos, timeElapsed/oneWayDuration); 
     yield return new WaitForEndOfFrame(); 
    } 
    //Just in case 
    transform.position = startPos; 
}