C# で System.NotImplementedException を解消したい

実現したいこと

ここに実現したいことを箇条書きで書いてください。

前提

ここに質問の内容を詳しく書いてください。

Unity で、あらかじめ用意した質問群から1つ選ぶプログラムを作成しています。
プログラムを選ぶ方法は、上から順に取得する方法と、ランダムに取得する方法の2種類があります。

前述の2つの方法をそれぞれ別のクラスに定義し、呼び出し側はインタフェースに依存するようにしたいです。
困っていることは、後述するエラーメッセージの解決方法がわからない点です。

NotImplementedException とあるので、 interface の宣言を実装クラス側で定義していないことなのかとも思いましたが、ソースコードを見直しても問題点を見つけられていません。

発生している問題・エラーメッセージ

Assets/UdonSharp/UtilityScripts/InteractToggle.cs(38,38): System.NotImplementedException: The method or operation is not implemented

該当のソースコード

C#

1using UnityEngine;2using VRC.SDK3.Components;3using VRC.Udon;4using VRC.SDKBase;5using TMPro;6 7namespace UdonSharp.Examples.Utilities 8{9 [UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]10 11 public class InteractToggle : UdonSharpBehaviour 12 {13 14 [UdonSynced(UdonSyncMode.None), SerializeField] public int index = 0;15 16 [SerializeField]17 public TextMeshProUGUI message;18 19 [SerializeField]20 public bool isRandom;21 22 [SerializeField]23 public AudioSource chime;24 25 [SerializeField]26 public AudioSource chimeDown;27 28 [SerializeField]29 public string[] candidateMessages;30 31 private IQuestionUpdate questionUpdate;32 33 34 public override void Interact()35 {36 if (this.isRandom) {37 38 this.questionUpdate = new RandomQuestionPicker(this);39 40 } else {41 this.questionUpdate = new SequentialQuestionPicker(this);42 }43 44 if (!Networking.IsOwner(this.gameObject)) {45 Networking.SetOwner(Networking.LocalPlayer, this.gameObject);46 }47 48 questionUpdate.BeforeUpdateMessage();49 RequestSerialization();50 SomeUpdate();51 questionUpdate.AfterUpdateMessage();52 }53 54 private void SomeUpdate() {55 questionUpdate.UpdateMessage();56 }57 58 public override void OnDeserialization() {59 SomeUpdate();60 }61 }62 63 interface IQuestionUpdate {64 65 void BeforeUpdateMessage();66 void UpdateMessage();67 void AfterUpdateMessage();68 }69 70 class RandomQuestionPicker : IQuestionUpdate {71 private InteractToggle interactToggle;72 public RandomQuestionPicker(InteractToggle interactToggle) {73 this.interactToggle = interactToggle;74 }75 76 void IQuestionUpdate.BeforeUpdateMessage() {77 this.interactToggle.index = Random.Range(0, this.interactToggle.candidateMessages.Length);78 }79 80 void IQuestionUpdate.UpdateMessage() {81 this.interactToggle.message.text = this.interactToggle.candidateMessages[this.interactToggle.index];82 this.interactToggle.chime.Play();83 }84 85 void IQuestionUpdate.AfterUpdateMessage() {86 return;87 }88 }89 90 class SequentialQuestionPicker : IQuestionUpdate {91 private InteractToggle interactToggle;92 public SequentialQuestionPicker(InteractToggle interactToggle) {93 this.interactToggle = interactToggle;94 }95 96 void IQuestionUpdate.BeforeUpdateMessage() {97 return;98 }99 100 void IQuestionUpdate.UpdateMessage() {101 if (this.interactToggle.index < this.interactToggle.candidateMessages.Length) {102 this.interactToggle.message.text = this.interactToggle.candidateMessages[this.interactToggle.index];103 this.interactToggle.chimeDown.Stop();104 this.interactToggle.chime.Play();105 } else {106 this.interactToggle.message.text = "";107 this.interactToggle.chime.Stop();108 this.interactToggle.chimeDown.Play();109 }110 }111 112 void IQuestionUpdate.AfterUpdateMessage() {113 this.interactToggle.index += 1;114 if (this.interactToggle.index >= this.interactToggle.candidateMessages.Length) {115 this.interactToggle.index = 0;116 }117 }118 }119}

試したこと

  • interface で定義しているメソッド名と、interface の実装クラスで定義しているメソッド名が同じことを確認しました

補足情報(FW/ツールのバージョンなど)

Unity version 2019.4.31f1

コメントを投稿

0 コメント