2017-12-24 8 views
1

私は半作品のコードを書いています。すべてが作業アニメーションから離れて機能します。アニメーターをコライダーでプレイする(Unity3d/c#)

私がしようとしていることは、プレーヤーがトリガを入力し、彼/彼女がEを押すとアニメーションを実行することです。 (アニメーションはうまく動作していますので、コードエラーですか?)

は、ここで私はこれまで得たものです:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class barTrigger : MonoBehaviour { 

    // press shit to drink text 
    public GameObject drinkText; 

    // bottle 
    public GameObject alcBottle; 

    // drink animator 
    public GameObject animatorOjbect; 
    Animator drinkAmin; 

    public bool triggerIsOn; 

    // Use this for initialization 
    void Start() { 

     drinkAmin = animatorOjbect.GetComponent<Animator>(); 

     drinkText.SetActive(false); 
     alcBottle.SetActive(false); 

    } 

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

    } 

    void OnTriggerEnter(Collider other){ 

     triggerIsOn = true; 

     if (other.gameObject.name == "vThirdPersonController") { 
      drinkText.SetActive (true); 

     } 

     if (triggerIsOn && Input.GetKeyDown (KeyCode.E)) { 

      drinkAmin.Play ("Dab"); 
      alcBottle.SetActive (true); 
     } 


    } 

    void OnTriggerExit(Collider other){ 

     if (other.gameObject.name == "vThirdPersonController") { 
      drinkText.SetActive (false); 
      alcBottle.SetActive (false); 
     } 
    } 
} 

助けてください?

+0

'Debug.Log'を使って' OnTriggerEnter'と 'OnTriggerExit'関数が呼び出されるようにします。 – Programmer

+0

@Programmer duh。すでにテスト済みです。 – papi

+0

私はあなたを助けることはできませんが、GameObjectのdrinkTextに関するコメントは素晴らしいです。私が提案できるベストは、OnTriggerEnterにブレークポイントを設定し、Eを押すとtriggerIsOnの値が何であるかを確認することです。ロジックに従って、別の場所にリセットされているかどうかを確認します。 – Brien

答えて

1

OnTriggerEnterが一度呼び出されると、Eボタンを押して、それを同時に検出することが難しくなります(Input.GetKeyDown(KeyCode.E))。 OnTriggerStay関数のE入力をチェックする方が適切ですが、OnTriggerStayは時々動作しません。それが存在することを知る価値はありますが。

毎フレーム次いでと呼ばOnTriggerExit関数でOnTriggerEnter関数でtruefalseに設定されているUpdate関数に移動Input.GetKeyDown(KeyCode.E)。変更するコードは以下のとおりです。

void Update() 
{ 
    if (triggerIsOn && Input.GetKeyDown(KeyCode.E)) 
    { 
     Debug.Log("E button pressed"); 
     drinkAmin.Play("Dab"); 
     alcBottle.SetActive(true); 
    } 
} 

void OnTriggerEnter(Collider other) 
{ 
    if (other.gameObject.name == "vThirdPersonController") 
    { 
     Debug.Log("Detected vThirdPersonController"); 
     triggerIsOn = true; 
     drinkText.SetActive(true); 
    } 
} 

void OnTriggerExit(Collider other) 
{ 

    if (other.gameObject.name == "vThirdPersonController") 
    { 
     Debug.Log("Lost vThirdPersonController"); 
     triggerIsOn = false; 

     drinkText.SetActive(false); 
     alcBottle.SetActive(false); 
    } 
} 

あなたが働いて、それがより堪能であるようCompareTag機能の代わりに、gameObject.nameを使用して開始することを得れば。

+0

ああ。今はそんなに意味があります。私はそれが1つのフレームのためだけに働いていたことを忘れていました、そして、私のやり方を使うのは、ほとんど不可能です。 – papi

+0

私はそれが働きたかったのと同じように動作します。私は残りの部分を実装するために行く。ありがとう、私は本当にそれを感謝します。ハッピークリスマスイブ! <3 – papi

+0

問題ありません。あなたはそのように働くには非常に速くなければなりませんが、過去の同じ過ちを犯したときに、私はそのように働くことは決してありませんでした。ハッピーコーディング! – Programmer

関連する問題