2017-02-17 111 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; 
} 
相关问题