

Unity3DでFPSを開発しています。

以下のスクリプトで、フィールドに立つキャラクターをプレイヤーが接触すると、コルーチンが起動し、メッセージダイアログが表示されるようになっています。

【発生している問題】  
現在、プレイヤーがキャラクターを接触すると、コルーチンが1回だけ実行され、2回目の接触以降は再表示されることがありません。

【修正したい点】  
**プレイヤーがキャラクターに接触するたびにダイアログが表示されるようにコルーチンをループさせたい** のですが、どのような方法が適切でしょうか？

また、`OnCollisionEnter`を使用してもコルーチンが一度しか動作しないのはなぜか知りたいです。

試行錯誤の結果、`While(true)` の中に `yield return new WaitForSeconds(0.01f);`
を囲んでみましたが、無意味でした。

`OnCollisionEnter()`は接触するたびに実行されるはずなので、`void
Update()`は必要ないように思います。`OnEnable()`と`OnDisable()`のメソッドも考えましたが、どう書き換えればいいのかアドバイスを求めています。具体的なコードの書き方について情報を探したのですが、私が抱えている問題と似たようなトピックが見つからないので、一人では解決が困難です。

_MessageScript.cs (会話するキャラクターにアタッチしたスクリプト)_

[code]

    using UnityEngine;
    using System.Collections;
    using UnityEngine.UI;
    
    public class MessageScript : MonoBehaviour
    {
        [SerializeField]
        private Message messageScript;// Load the Message script.
        public string[] message1;// Create as many conversations as you want to manage.
        public string[] message2;
        public string[] message3;
    
        public void Start()
        {
          
        }
    
    
        void OnCollisionEnter(Collision col) 
        {
          if (col.gameObject.name == "Player")  
            {
                StartCoroutine("Message",message1);// Execute Message coroutine.
            }
        }
     
        IEnumerator Message(string[] Conversation)// Message Coroutine
        {
    
            yield return new WaitForSeconds(0.01f);// Wait 0.01 second.
            messageScript.SetMessagePanel(Conversation);// Execute SetMessagePanel of messageScript
    
            
        }
    }
    
    
[/code]

キャラクターの台詞を制御するスクリプトを追加しました。  
コードの中に、コルーチンの再実行を妨げているものがあれば教えてください。  
よろしくお願いいたします。

_Message.cs(キャラの会話を制御するスクリプト)_

[code]

    void SetMessage(string message)// SetMessage
        {
            this.message = message;// Make the message of this object a message
        }
     
        public void SetMessagePanel(string[] message)// SetMessagePanel
        {
            i = 0;// Set i to 0
            stringsCount = message.Length;// Set the total number of lines in the string to the number of elements in the message
    
            conversation = message;// Make coversation a message.
            canvas.SetActive(true);// Display the canvas
            SetMessage(conversation[0]);// Execute SetMessage.
            canvas.transform.GetChild(1).gameObject.SetActive(true);// Display the child objects of the canvas
    
            isEndMessage = false;// Set isEndMessage to false.
        }
    
[/code]


CC BY-SA 4.0
2022-01-09T14:43:37.807
85590
2022-02-13T10:09:54.267
2022-01-09T15:25:07.627
50816
50816
question
c# unity3d
コルーチンが一回しか呼び出されない


日本語が母語ではないので、ご勘弁お願い申しあげます。  
随分古い質問なので、もう回答に自分でたどり着いたかも知りませんが。  
他の質問があれば、是非教えて下さい。

「コールチンが一度しか実行していない」と書かれていますが、その根拠はなんですか？  
私から見るとコールチンが何度も実行しても表示するテキストが変わらないだけです。

毎回違うテキストを表示するには、全部 **List** に入れて、一つずつ引き出した方がいいです。

Message.csの全体が見えないので、望んでいるようにテキストが表示されるかどうか分かりません。

**例:**

[code]

    using UnityEngine;
    using System.Collections;
    using UnityEngine.UI;
    
    public class MessageScript : MonoBehaviour
    {
        [SerializeField]
        private Message messageScript;// Load the Message script.
        public string[] message1;// Create as many conversations as you want to manage.
        public string[] message2;
        public string[] message3;
        
        private List<string[]> messageList = new List<string[]>();
        private int index;
        
    
        public void Start()
        {
           messageList.Add(message1);
           messageList.Add(message2);
           messageList.Add(message3);
        }
    
    
        void OnCollisionEnter(Collision col) 
        {
          if (col.gameObject.name == "Player")  
            {
                StartCoroutine("Message", messageList[index]);// Execute Message coroutine.
                index = index + 1;
            }
        }
     
        IEnumerator Message(string[] Conversation)// Message Coroutine
        {
    
            yield return new WaitForSeconds(0.01f);// Wait 0.01 second.
            messageScript.SetMessagePanel(Conversation);// Execute SetMessagePanel of messageScript
    
            
        }
    }
    
[/code]


CC BY-SA 4.0
2022-02-12T08:56:05.007
86286
2022-02-13T10:09:54.267
2022-02-13T10:09:54.267
3060
51394
85590
answer