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

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

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

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

Unity

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

Q&A

解決済

1回答

123閲覧

Unity C# 最初に生成されたオブジェクトにスプライトが反映されず、次に生成されたオブジェクトからずれて反映されてしまう

aiolos_da4

総合スコア4

C#

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

Unity

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

0グッド

0クリップ

投稿2024/10/11 02:11

実現したいこと

オブジェクトが生成されたときに、ScriptableObjectから対応するスプライトを持ってきて貼り付ける機能の実現

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

オブジェクトが生成されたときに、ScriptableObjectから対応するスプライトを持ってきて貼り付ける機能をプログラムしたいのですが、なぜか最初に生成されたオブジェクトにはスプライトが反映されず、その次に生成されたオブジェクトにはひとつ前に生成されたオブジェクトに反映されるはずのスプライトが反映されている状態になってしまいます。
Debug.Log等を使用した結果、このような現象が発生していることは分かったのですが、解決法がわかりません。
エラーメッセージも出ないので使用しているすべてのソースコードを貼らせていただきます。

該当のソースコード

TargetGenerator

1using System; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class TargetGenerator : MonoBehaviour 6{ 7 public GameObject targetPrefab; 8 9 // Start is called before the first frame update 10 void Start() 11 { 12 Application.targetFrameRate = 60; 13 } 14 15 // Update is called once per frame 16 void Update() 17 { 18 19 } 20 21 public void InstantiateTarget() 22 { 23 GameObject go = Instantiate(targetPrefab); 24 go.transform.position = new Vector3(16, 0, 0); 25 GameObject director = GameObject.Find("SpriteDirector"); 26 director.GetComponent<SpriteDirector>().ChangeSprite(); 27 } 28} 29

TargetController

1using System; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class TargetController : MonoBehaviour 6{ 7 8 9 // Start is called before the first frame update 10 void Start() 11 { 12 Application.targetFrameRate = 60; 13 } 14 15 // Update is called once per frame 16 void Update() 17 { 18 19 transform.Translate(-0.1f, 0, 0); 20 21 if (transform.position.x < -12.0f) 22 { 23 Destroy(gameObject); 24 Debug.Log("destroy"); 25 26 GameObject generator = GameObject.Find("TargetManager"); 27 generator.GetComponent<TargetGenerator>().InstantiateTarget(); 28 } 29 30 31 32 } 33} 34

SpriteDirector

1using JetBrains.Annotations; 2using System.Collections; 3using System.Collections.Generic; 4using Unity.VisualScripting; 5using UnityEngine; 6 7public class SpriteDirector : MonoBehaviour 8{ 9 public CharaDataAsset charaDatas; 10 public GameObject cl; 11 GameObject clickedGameObject; 12 13 Dictionary<int, string> charas; 14 Dictionary<int, float> encounter; 15 16 public static int enra; 17 18 void Start() 19 { 20 if (cl.GetComponent<SpriteRenderer>().sprite == null) 21 { 22 GameObject generator = GameObject.Find("TargetManager"); 23 generator.GetComponent<TargetGenerator>().InstantiateTarget(); 24 } 25 else 26 { 27 Debug.Log("sprite remain"); 28 cl.GetComponent<SpriteRenderer>().sprite = null; 29 GameObject generator = GameObject.Find("TargetManager"); 30 generator.GetComponent<TargetGenerator>().InstantiateTarget(); 31 } 32 } 33 34 void Update() 35 { 36 if (Input.GetMouseButtonDown(0)) 37 { 38 clickedGameObject = null; 39 40 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 41 RaycastHit2D hitSprite = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction); 42 43 if (hitSprite == true) 44 { 45 clickedGameObject = hitSprite.transform.gameObject; 46 if (clickedGameObject.CompareTag("chara")) 47 { 48 if (enra > 12) 49 { 50 Debug.Log("obasan"); 51 } 52 else 53 { 54 Destroy(clickedGameObject); 55 Debug.Log(charaDatas.dataList[enra].charaname + "deleted"); 56 57 GameObject generator = GameObject.Find("TargetManager"); 58 generator.GetComponent<TargetGenerator>().InstantiateTarget(); 59 } 60 } 61 } 62 } 63 } 64 65 public void ChangeSprite() 66 { 67 GetEncounter(); 68 69 if (cl == null) 70 { 71 Debug.Log("null"); 72 } 73 else 74 { 75 cl.GetComponent<SpriteRenderer>().sprite = charaDatas.dataList[enra].graffic; 76 Debug.Log(charaDatas.dataList[enra].charaname); 77 } 78 } 79 80 public void GetEncounter() 81 { 82 InitializeDicts(); 83 84 enra = Choose(); 85 86 string enname = charas[enra]; 87 Debug.Log(enname + "に遭遇"); 88 89 } 90 91 void InitializeDicts() 92 { 93 charas = new Dictionary<int, string>(); 94 charas.Add(0, "キョウトくん"); 95 charas.Add(1, "アラシヤマちゃん"); 96 charas.Add(2, "ウマホリちゃん"); 97 charas.Add(3, "フナオカくん"); 98 charas.Add(4, "アヤベちゃん"); 99 charas.Add(5, "タケノちゃん"); 100 charas.Add(6, "アマルベくん"); 101 charas.Add(7, "キマチくん"); 102 charas.Add(8, "オオダシくん"); 103 charas.Add(9, "マジくん"); 104 charas.Add(10, "アサリちゃん"); 105 charas.Add(11, "ハマダくん"); 106 charas.Add(12, "センザキくん"); 107 charas.Add(13, "絶対違うおばさん"); 108 charas.Add(14, "絶対違うおばさん"); 109 charas.Add(15, "絶対違うおばさん"); 110 charas.Add(16, "絶対違うおばさん"); 111 charas.Add(17, "絶対違うおばさん"); 112 charas.Add(18, "絶対違うおばさん"); 113 charas.Add(19, "絶対違うおばさん"); 114 charas.Add(20, "絶対違うおばさん"); 115 116 encounter = new Dictionary<int, float>(); 117 encounter.Add(0, 10.0f); 118 encounter.Add(1, 10.0f); 119 encounter.Add(2, 7.0f); 120 encounter.Add(3, 7.0f); 121 encounter.Add(4, 7.0f); 122 encounter.Add(5, 5.0f); 123 encounter.Add(6, 5.0f); 124 encounter.Add(7, 4.8f); 125 encounter.Add(8, 3.0f); 126 encounter.Add(9, 3.0f); 127 encounter.Add(10, 3.0f); 128 encounter.Add(11, 3.0f); 129 encounter.Add(12, 0.2f); 130 encounter.Add(13, 4.0f); 131 encounter.Add(14, 4.0f); 132 encounter.Add(15, 4.0f); 133 encounter.Add(16, 4.0f); 134 encounter.Add(17, 4.0f); 135 encounter.Add(18, 4.0f); 136 encounter.Add(19, 4.0f); 137 encounter.Add(20, 4.0f); 138 139 } 140 141 int Choose() 142 { 143 float total = 0; 144 145 foreach (KeyValuePair<int, float> elem in encounter) 146 { 147 total += elem.Value; 148 } 149 150 float randomPoint = Random.value * total; 151 152 foreach (KeyValuePair<int, float> elem in encounter) 153 { 154 if (randomPoint < elem.Value) 155 { 156 return elem.Key; 157 } 158 else 159 { 160 randomPoint -= elem.Value; 161 } 162 } 163 164 return 0; 165 } 166 167} 168

試したこと・調べたこと

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

Googleで「Unity スプライト バグ」や「Unity スプライト 反映されない」と検索しましたが、解決には至りませんでした。

補足

Unity: 2022.3.11f1

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

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

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

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

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

guest

回答1

0

自己解決

TargetGeneratorの

GameObject go = Instantiate(targetPrefab); go.transform.position = new Vector3(16, 0, 0); GameObject director = GameObject.Find("SpriteDirector"); director.GetComponent<SpriteDirector>().ChangeSprite();

の部分を入れ替えて

GameObject director = GameObject.Find("SpriteDirector"); director.GetComponent<SpriteDirector>().ChangeSprite(); GameObject go = Instantiate(targetPrefab); go.transform.position = new Vector3(16, 0, 0);

にして、オブジェクト生成前にスプライトを反映するようにしたところ、解決しました。

投稿2024/10/11 03:12

aiolos_da4

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問