2017-02-17 5 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

Btwでは、移動距離は間違っています。これは、各フレームに移動した合計距離を加算するためです。 '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; 
} 
関連する問題