質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.36%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

230閲覧

アセットを使わずに画面をクリックする度に画像が切り替わるイベントを作りたい

Jinsei_new_play

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2024/11/16 05:40

編集2024/11/16 05:41

実現したいこと

ご閲覧いただきありがとうございます。私は、最近ゲームの個人制作を始めた ただの一般社会人です。

早速、本題に入ります。

現在、私は「Unity」を使って2Dゲームを制作しております。
命題の通り、画面をクリックする度に画像が切り替わるイベントを作りたく、以下のサイトを参考にCSを改変したところ下記のエラーメッセージが出てしまいました。

参考サイト:https://bokulog.org/unity-showlog/

この問題をどうにか解決する方法はございませんでしょうか?
また、参考になりそうなサイト等ございましたら、ご教示いただけますと嬉しい限りです。
よろしくお願いします。

発生している問題・分からないこと

GetComponent<Sprite>().sprite = PrologueImage[i]; に存在しないメソッドがあるらしいのですが、分からずじまいとなっております。

//Sprite sprite = PrologueImage[i]; の方ではエラーは発生しないものの、いざテストしたところうまくいきませんでした(もしかしたらUnityの方でアタッチ等の仕方が良くないのかもしれませんが…)

エラーメッセージ

error

1MouseClick.cs(38,36): error CS1061: 'Sprite' does not contain a definition for 'sprite' and no accessible extension method 'sprite' accepting a first argument of type 'Sprite' could be found (are you missing a using directive or an assembly reference?)

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.SceneManagement; 6 7public class MouseClick : MonoBehaviour 8{ 9 [SerializeField] [Header("表示する画像")] private Sprite[] PrologueImage; 10 11 GameObject objCanvas = null; 12 //public Sprite sprite; 13 14 void Start() 15 { 16 objCanvas = gameObject.transform.Find("Canvas").gameObject; 17 objCanvas.SetActive(false); 18 } 19 20 void Update() 21 { 22 if (Input.GetMouseButtonDown(0)) 23 { 24 StartCoroutine("ShowLog"); 25 //Debug.Log("原因じゃないよ"); 26 } 27 } 28 29 IEnumerator ShowLog() 30 { 31 //GameObject objCaraName = objCanvas.transform.Find("PrologueImage").gameObject; 32 33 objCanvas.SetActive(true); 34 35 for (int i = PrologueImage.GetLowerBound(0); i <= PrologueImage.GetUpperBound(0); i++) 36 { 37 //Sprite sprite = PrologueImage[i]; 38 GetComponent<Sprite>().sprite = PrologueImage[i]; 39 40 yield return new WaitUntil(() => Input.GetMouseButtonDown(0)); 41 yield return null; 42 } 43 44 objCanvas.SetActive(false); 45 } 46}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

こちらは参照元のコードになります。

[SerializeField] [Header("メッセージ(キャラ名)")] private string[] msgCaraName;
[SerializeField] [Header("メッセージ(内容)")] private string[] msgContent;

GameObject objCanvas = null;

void Start()
{
objCanvas = gameObject.transform.Find("Canvas").gameObject;
objCanvas.SetActive(false);
}

void Update()
{
if (Input.GetMouseButtonDown(0))
{
StartCoroutine("ShowLog");
}
}

IEnumerator ShowLog()
{
GameObject objCaraName = objCanvas.transform.Find("CaraName").gameObject;
GameObject objContent = objCanvas.transform.Find("Content").gameObject;

objCanvas.SetActive(true); for (int i = msgCaraName.GetLowerBound(0); i <= msgCaraName.GetUpperBound(0); i++) { objCaraName.GetComponent<Text>().text = msgCaraName[i]; objContent.GetComponent<Text>().text = msgContent[i]; yield return new WaitUntil(() => Input.GetKeyDown(KeyCode.Space)); yield return null; } objCanvas.SetActive(false);

}

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Jinsei_new_play

2024/11/16 12:30

下記サイトにて近しい挙動を見つけましたが、これではSC上でたくさん書くため、処理の負荷対策とならないので、不採用となりました。 https://tsubakit1.hateblo.jp/entry/2018/02/20/220747#%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E6%8A%BC%E3%81%97%E3%81%9F%E3%82%89%E8%A1%A8%E6%83%85%E3%82%82%E5%A4%89%E3%82%8F%E3%82%8B IEnumerator Start () { textbox.text = "衝撃のファーストブリット"; body.sprite = atlas.GetSprite("kohaku_base"); face.sprite = atlas.GetSprite("kohaku_1"); yield return new WaitUntil(()=>Input.GetMouseButtonDown(0)); yield return null; face.sprite = atlas.GetSprite("kohaku_2"); textbox.text = "撃滅のセカンドブリット"; yield return new WaitUntil(()=>Input.GetMouseButtonDown(0)); yield return null; face.sprite = atlas.GetSprite("kohaku_3"); textbox.text = "抹殺のラストブリット"; }
fiveHundred

2024/11/16 12:54 編集

> 下記サイトにて近しい挙動を見つけましたが、これではSC上でたくさん書くため、処理の負荷対策とならないので、不採用となりました。 これで「処理の負荷対策とならない」という発言は意味不明すぎます。 SC上でたくさん書いても、変なループ処理などがなければ、処理時間は一瞬です。 例えば for (int loop = 0; loop < 100000000000; loop++) { test(); } と test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); は後者のほうがコードが長いですが、処理時間は明らかに100000000000回行う前者のほうが遅いに決まっています。
guest

回答2

0

ベストアンサー

Spriteはただの画像であり、それを表示するにはSpriteRendererUI.Imageを使います。

投稿2024/11/16 08:05

fiveHundred

総合スコア10151

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Jinsei_new_play

2024/11/16 12:25

ご回答ありがとうございます。 「SpriteRenderer」について色々と調べてみたのですが、私が欲しい挙動が記載された記事が見当たりませんでした… 投稿文の方も一度見直し、言葉不足の可能性も考慮して、補足させてください。 実現したいことは「画面をクリックする度に画像が切り替わるイベント」ですが、詳しくは画像を当てるリストをインスペクターに埋め込みたく、[SerializeField]で参照して「IEnumerator」できるようにしたいという内容でした。 参照元のコードでは objContent.GetComponent<Text>().text = msgContent[i]; とTextのコンポーネントを取得しているのですが、じゃあここをImageかSpriteに変えればできるのでは?と思い、改変した結果今に至るといった感じです。 私の理解不足で申し訳ないのですが、差し支えなければ具体的な方法や参考となるサイトの記事等をご教示いただけないでしょうか?
fiveHundred

2024/11/16 12:40 編集

エディタで表示できているということは、(UI.)ImageかSpriteRendererのどちらかを使っているはずです。 それを「obj.GetComponent<Image>()」(objはImageをアタッチしているゲームオブジェクト)で取得すればいいだけです。 この場合、どちらもspriteプロパティが存在するので、(Imageであれば)「obj.GetComponent<Image>().sprite = msgContent[i];」でよいでしょう。 > 実現したいことは「画面をクリックする度に画像が切り替わるイベント」ですが、詳しくは画像を当てるリストをインスペクターに埋め込みたく、[SerializeField]で参照して「IEnumerator」できるようにしたいという内容でした。 これについては、意図が分かりません。 [SerializeField]とIEnumeratorは全く関係のない別のものです。 また、IEnumeratorでも関数は使えるため、やることは全く変わりないです。
Jinsei_new_play

2024/11/16 14:11

無事にコンパイラエラーは解決いたしました。 また、大きくご迷惑をおかけしてしまい申し訳ございませんでした。 今後はこのようなことが起きないよう注意していきます。 ここまで長いことお付き合いいただきありがとうございました。 挙動に関しては別途の質問を投稿しようかと思います。
guest

0

GetComponent<Sprite>().sprite = PrologueImage[i]; に存在しないメソッドがあるらしいのですが、分からずじまいとなっております。

こちらに関してはGetComponent<Sprite>()この部分でSpriteクラスのコンポーネントを取得するといった意味合いになります。
そしてGetComponent<Sprite>().spriteこうするとGetComponent<Sprite>()にて取得したSpriteクラスのspriteというプロパティにアクセスすることを意味します。
そして、Spriteクラスにはspriteというプロパティは存在しません。
なので'Sprite' does not contain a definition for 'sprite' and no accessible extension method 'sprite' accepting a first argument of type 'Sprite' could be foundというエラーとなります。

次に

Sprite sprite = PrologueImage[i]; の方ではエラーは発生しないものの

こちらがエラーにならないことについてですがこちらはSpriteクラスの型のspriteという名前の変数を作成しその変数に代入するといったものとなります。
なので前者のエラーになる物とは意味の違う動作となります。

そして絵を切り替えるといった動作に関してですが、私はUnityはほぼほぼ分からないので適切なアドバイスができません。
ですがCanvas上に表示するのであればCanvas側になにかしらの操作が必要だと思います。

投稿2024/11/16 07:43

YAmaGNZ

総合スコア10469

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Jinsei_new_play

2024/11/16 08:26

ご回答ありがとうございます。 今一度、エディター側の見直しもしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問