2016-11-14 3 views
0

Im Skript ist dies das Original, wo der Teil der Eltern innerhalb der Funktion OnTriggerEnter war:Warum bewegt sich der Player, wenn er von der Plattform herunterfällt, während sich die Plattform nach oben bewegt, nicht?

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

public class DetectPlayer : MonoBehaviour { 

    GameObject target; 

    public void ClearLog() 
    { 
     var assembly = Assembly.GetAssembly(typeof(UnityEditor.ActiveEditorTracker)); 
     var type = assembly.GetType("UnityEditorInternal.LogEntries"); 
     var method = type.GetMethod("Clear"); 
     method.Invoke(new object(), null); 
    } 

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

    } 

    void OnTriggerEnter(Collider other) 
    { 
     if (other.gameObject.name == "OnTop Detector") 
     { 
      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; 
      StartCoroutine(playAnim(target)); 
     } 
    } 

    IEnumerator playAnim(GameObject target) 
    { 
     Animation anim = target.GetComponent<Animation>(); 
     int counter = 0; 

     foreach (AnimationState clip in anim) 
     { 
      // do initialisation or something on clip 
      clip.speed = 1; 
     } 

     while (true) 
     { 
      if (counter == 10) 
       break; 
      //Play Up Anim 
      anim.Play("Up"); 

      //Wait until Up is done Playing the play down 
      while (anim.IsPlaying("Up")) 
      { 
       yield return null; 
      } 

      //Now Play Down Anim 
      anim.Play("Down"); 

      //Wait until down is done Playing 
      while (anim.IsPlaying("Down")) 
      { 
       yield return null; 
      } 

      yield return null; //Make sure there is no freezing 

      //Return to the top of the while|true loop 

      counter++; 
     } 
    } 
} 

Und das ist, nachdem ich das übergeordnete Teil aus dem OnTriggerEnter entfernt und in der Funktion starten setzen i erstellt:

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

public class DetectPlayer : MonoBehaviour { 

    GameObject target; 

    void Start() 
    { 
     GameObject findGo = GameObject.Find("ThirdPersonController"); 
     GameObject findGo1 = GameObject.Find("Elevator"); 
     findGo.transform.parent = findGo1.transform; 
    } 

    public void ClearLog() 
    { 
     var assembly = Assembly.GetAssembly(typeof(UnityEditor.ActiveEditorTracker)); 
     var type = assembly.GetType("UnityEditorInternal.LogEntries"); 
     var method = type.GetMethod("Clear"); 
     method.Invoke(new object(), null); 
    } 

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

    } 

    void OnTriggerEnter(Collider other) 
    { 
     if (other.gameObject.name == "OnTop Detector") 
     { 
      Debug.Log("On Top of Platform"); 
      target = GameObject.Find("Elevator"); 
      StartCoroutine(playAnim(target)); 
     } 
    } 

    IEnumerator playAnim(GameObject target) 
    { 
     Animation anim = target.GetComponent<Animation>(); 
     int counter = 0; 

     foreach (AnimationState clip in anim) 
     { 
      // do initialisation or something on clip 
      clip.speed = 1; 
     } 

     while (true) 
     { 
      if (counter == 10) 
       break; 
      //Play Up Anim 
      anim.Play("Up"); 

      //Wait until Up is done Playing the play down 
      while (anim.IsPlaying("Up")) 
      { 
       yield return null; 
      } 

      //Now Play Down Anim 
      anim.Play("Down"); 

      //Wait until down is done Playing 
      while (anim.IsPlaying("Down")) 
      { 
       yield return null; 
      } 

      yield return null; //Make sure there is no freezing 

      //Return to the top of the while|true loop 

      counter++; 
     } 
    } 
} 

In beiden Fällen funktioniert es gut, wenn der Spieler auf der Plattform und "On Top of Platform" ist.

Das Problem ist, während die Platfrom auf und ab bewegt und ich den Spieler bewegen, um aus der Plattform auf den Boden fallen dann alles Stottern/Schütteln. Es passiert nur, wenn sich die Plattform nach oben oder unten bewegt und während sie sich auf und ab bewegt, entferne ich den Player.

Und sobald die Plattform nach 10 Mal auf und ab geht, ist alles wieder in Ordnung. Ich habe versucht, den Parent-Part in die Start-Funktion zu verschieben, aber das hat nicht geholfen. Immer noch stottern/schütteln, wenn der Spieler sich aus der Plattform/dem Aufzug bewegt, während er sich nach oben/unten bewegt.

Dies ist ein kleiner Videoclip i zeigt das Problem aufgezeichnet:

Video clip stuttering

+0

es Sinn machen würde, den Code, den Sie die Spieler bewegen verwenden zu setzen. Es ist schwierig, Ihr Problem ohne dieses Problem neu zu erstellen. Vielleicht möchten Sie auch ein animiertes Gif des Stotterns/Schüttelns des Spielers posten. – Programmer

+0

@Programmer Ich bin mir nicht sicher, wie man animiertes Gif herstellt, aber ich schuf ein kleines Video in Youtube, das das Problem zeigt: https://www.youtube.com/watch?v=9Ro5QrywLCC&feature=youtu.be und über den Spieler, der i bewegt verwende das ursprüngliche ThirdPersonController-Steuerelement. –

Antwort

0

Die Lösung, die den ersten Original-Code zu halten war. Und OnTriggerExit Funktion hinzuzufügen und unparent die Gameobject:

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