2017-04-11 12 views
0

私は、ユーザーが選択するオプションを持つダイアログシステムを作成しています。テキストフィールドを使用して応答を取得するか、選択肢が増えます。ユニティメソッドを同じキー入力で2回更新する

最初は3つのオプションがあります。これらの3つのオプションはスクリプトに属し、別の2つのオプションは両方とも同時に動作する別の2つのオプションに属します。各オプションには、intインデックス(最初のオプション= 0、2番目のオプション= 1など)があります。私はオプション1を押すとインデックスが3になり、4番目のオプションに行くようにしました。 ユーザーがキー入力を待つためにUpdateにすべてを入れましたので、ユーザーがEnterを押すたびに両方のスクリプトから実行されるので、両方のステートメントを一度に入力できます。

私はオプション1を選択したときに私はそれをEnterキーを押したときに、私は押したときにオプション1に入力するように

どのように私はそれを作ることができ、両方のスクリプトから実行されますので、イムは即座にオプション4の応答を取得し、基本的に起こっていただきましたそれは他の声明を無視してください。以下のスクリーンショットあなたの最初のスクリプトを考慮

 if (Input.GetKey (KeyCode.Return)) { 

      if (indexConversation == 0) { 
       Debug.Log("first Option"); 


       // GameObject.Find("Scripts2").SetActive(true); 

       telResponse.text = "Response 1"; 
       Conv1Controller.Conv1showConversation = true; 
       indexConversation = 3; 
       Debug.Log (indexConversation); 

      } else if (indexConversation == 1) { 

       Debug.Log("second Option"); 
       telResponse.text = "Response 2"; 
       StartCoroutine(responseTwoFollowedbySix()); 
      } 

      else if (indexConversation == 2) { 

       Debug.Log("third Option"); 
       telResponse.text = "Response 3"; 
       StartCoroutine(responseThreeFollowedbyFourFollowedbySeven()); 
      } 

      showConversation = false; 

     } 

他のスクリプト(オプション4と5)

if (Input.GetKey(KeyCode.Return)) 
     { 
      if (DialogueController.indexConversation == 3) 
      { 
       Debug.Log("Fourth Option"); 
       telResponse.text = "Response 4"; 


      } 


      if (DialogueController.indexConversation == 4) 
      { 

       Debug.Log("Option 5"); 
       telResponse.text = "Response 5"; 
      } 

      //Conv1showConversation = false; 


     } 
+3

コードをスクリーンショットとして投稿しないでください。あなたの質問にそのコードをコピーして投稿してください。 – Programmer

+0

同じスクリプトにそれらを入れることはできませんか? – CNuts

+0

私は別々のスクリプトに入れています。なぜなら、それらは同じ方法をオプション4と5だけ違っていますし、また2つのOnGUIが正しいのですか? –

答えて

0

indexConversation変数を持っており、あなたの2番目のスクリプトはDialogueController.indexConversationを使用して、それを参照するように思われるが、私はこの変数のように感じるaはpublic static int

まずスクリプトここ

[SerializeField] 
private YOUR_OTHER_SCRIPT_CLASS otherScript; 

if (Input.GetKey(KeyCode.Return)) 
{ 
    showConversation = false; 
    switch(indexConversation) 
    { 
     case 0: 
      Debug.Log("first Option"); 
      telResponse.text = "Response 1"; 
      Conv1Controller.Conv1showConversation = true; 
      indexConversation = 3; 
      Debug.Log (indexConversation); 
      break; 

     case 1: 
      Debug.Log("second Option"); 
      telResponse.text = "Response 2"; 
      StartCoroutine(responseTwoFollowedbySix()); 
      break; 

     case 2: 
      Debug.Log("third Option"); 
      telResponse.text = "Response 3"; 
      StartCoroutine(responseThreeFollowedbyFourFollowedbySeven()); 
      break; 

     default: 
      otherScript.ReturnKeyPressed(); 
      break; 
    } 
    showConversation = false; 
} 

私はあなたの他のスクリプトを参照するために変数を追加し、多くのifelse ifを避けるためにswitch命令を使用:このような状況では、単にこのような何かを行うことができます。 また、indexConversationの値が1,2、または3でない場合は、他のスクリプトが何かをするよう求めます。

他のスクリプトこのスクリプトで

public void ReturnKeyPressed() 
{ 
    switch(DialogueController.indexConversation) 
    { 
     case 3: 
      Debug.Log("Fourth Option"); 
      telResponse.text = "Response 4"; 
      break; 

     case 4: 
      Debug.Log("Option 5"); 
      telResponse.text = "Response 5"; 
      break; 

     default: 
      break; 
    } 
} 

は、入力検出が最初のスクリプトで作られ、必要な場合は、このスクリプトに送信されますので、if (Input.GetKey(KeyCode.Return))もうありません。

  • @Programmerはあなたがデバッグよりも何かのためにOnGUI()を使用しないでください、言ったように。このメソッドは、フレームごとに何度も呼び出されるので無駄です。実際には、Unity UI Systemを使用してUIを簡単に操作できます。
  • @Nabrenは、あなたのシステムがこの単純なケースよりも複雑な場合は、実際に作成された方法を変更し、入力を取得して適切なスクリプトに送信する入力マネージャクラスを用意する必要があります。あなたは本当に特定の「フォロー」会話にリンクすることができます応答と応答へのリンクを持っているモデルにあなたの会話を保存を考える必要があり、このことができます

希望、

0

。この方法で、スクリプトをできるだけ不自然なものとして書くことができます。あなたはそれに応答を与え、それをどのように扱うかを知っています。各応答は、応答モデルを取り込み、プレスイベントのボタンリスナーまたはキーリスナーを追加し、正しい入力を受け取ると、現在の応答モデルを使用して次の会話をロードする独自の「ResponseView」スクリプトを取得します。コードに具体的なメソッドを記述して、どこに行かなければならないのかをあなたの応答に伝えることは、非常に脆弱であり、まったくスケールされません。

関連する問題