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

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

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

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

Q&A

解決済

2回答

2457閲覧

Unity Sprite変換

kamisan

総合スコア19

C#

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

0グッド

0クリップ

投稿2017/02/13 01:57

編集2017/02/13 02:51

###実現したいこと
Box Collider2Dで当たったらSpriteを変える

できればUnity側でSpriteを固定してその画像に変える

###該当のソースコード

C#

1public class Player : MonoBehaviour { 2 3 SpriteRenderer MainSpriteRenderer; 4 // Spaceshipコンポーネント 5 Spaceship spaceship; 6 7 public Sprite onestage; 8 public Sprite twostep; 9 public Sprite Threestages; 10 11 12 IEnumerator Start() 13 { 14 15 MainSpriteRenderer = gameObject.GetComponent<SpriteRenderer>(); 16 17 18 } 19 20 void Update() 21 { 22 23 } 24 void OnTriggerExit2D(Collider2D other) 25 { 26 if (other.tag == "item") 27 { 28 MainSpriteRenderer.sprite = twostep; 29 } 30 if (other.tag == "item") 31 { 32 twostep = Threestages; 33 } 34 35 if (other.tag == "Enemy") 36 { 37 Threestages = twostep; 38 } 39 40 if (other.tag == "Enemy") 41 { 42 twostep = onestage; 43 } 44 } 45 46}

###試したこと

void OnTriggerExit2D(Collider2D other) { if (other.tag == "item") { MainSpriteRenderer.sprite = twostep; } if (other.tag == "item") { twostep = Threestages; } if (other.tag == "Enemy") { Threestages = twostep; } if (other.tag == "Enemy") { twostep = onestage; }

の部分を

void OnTriggerExit2D(Collider2D other) { switch (other.tag) { case "item": MainSpriteRenderer.sprite = twostep; break; case "Enemy": twostep = onestage; break; } }

と書き換えて画像は確かに変わるのですがUnityのSpriteのtwostepの画像がMainSpriteRenderer.spriteに塗り替えられて敵に当たって画像が戻ってもそのままtwostepの画像は初期の画像のままで変化なしです

if文で試したところ同じ結果です。。。

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

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

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

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

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

guest

回答2

0

ベストアンサー

コメントだとコード見づらくなるため回答に書きますが
つまり、アイテムをとるたびにパワーアップするが、敵に当たると逆に段階的にパワーダウンさせる。
ステップを保持するものと各ステップごとのスプライトをクラスのメンバ変数として用意して、あとは、ステップと配列からMainSpriteRenderer.spriteにスプライトを設定する。

c#

1public class Player : MonoBehaviour { 2 // 現在どのステップかを保持 3 int step = 0; 4 //あとステップごとのスプライトを配列として保持 5 Sprite[] stepSplites = new Sprite[] {nomalSplite, superSplite, hyperSplite}; 6 7 void OnTriggerExit2D(Collider2D other) { 8 if(other.tag == "item") step = Math.Min(1, step + 1); // アイテムならステップを増やす(Max 1) 9 else if(other.tag == "Enemy") step = Math.Max(0, step - 1); // 敵に当たれば逆にステップを減らす(Min 0) 10 MainSpriteRenderer.sprite = stepSplites[step]; // ステップのスプライトを適用 11 } 12}

といった感じでできないかな。

投稿2017/02/13 03:01

編集2017/02/13 03:57
turbgraphics200

総合スコア4267

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

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

kamisan

2017/02/13 03:46

ふむふむ。。。この場合だと tagで当たり判定と画像の呼び出しができるんですかっ var step は  void OnTriggerExit2D の外にあるとなぜかエラーを出されて実行できないのですが 内側に入れるとエラーがなくなるのはなぜなんでしょう。。。? 後、自分の説明不足でした。。。敵に当たっても1段階ずつステップダウンさせたいです そのようにするには  if(other.tag == "Enemy") step--; でできますか?
turbgraphics200

2017/02/13 03:59 編集

あ、ごめん、メンバ変数の場合は型ちゃんと指定しないといけないですね。 int step = 0; Sprite[] stepSplites = new Sprite[] {nomalSplite, superSplite, hyperSplite}; (回答内容も修正) ええ、stepp--;で対応可能と思います。
kamisan

2017/02/13 04:38

ありがとうございます! うまくやりたいようにできましたっ♪
guest

0

twostep = onestage; のところは MainSpriteRenderer.sprite = onstage; しちゃまずいの?

投稿2017/02/13 02:39

turbgraphics200

総合スコア4267

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

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

kamisan

2017/02/13 02:46 編集

twostep = onestage; のところを MainSpriteRenderer.sprite = onstage; にすると別に大丈夫なのですが 例を出すと・・・ スーパーマリオの初期マリオ画像をキノコの取得2つ目を取得するとファイヤーマリオ?に画像切り替えをしたいのです。。。
YAmaGNZ

2017/02/13 03:05

自分の状態を格納する変数を使用したほうが管理しやすいと思います。 private int playerstatus; と適当な場所で変数を宣言して switch (other.tag) {   case "item":     if (playerstatus <2)     {       playerstatus++;     }     break;   case "Enemy":     if ( playerstatus == 0)     {       playerstatsu=-1;     }     else     {       playerstatus=0;     }     break; } switch(playerstatus)   case 0:     MainSpriteRenderer.sprite = onstage;     break;   case 1:     MainSpriteRenderer.sprite = twostep;     break;   case 2:     MainSpriteRenderer.sprite = Threestages;     break;   case -1:     //最低状態で敵に当たった     //MainSpriteRenderer.sprite = out;     break; } といった感じで実装すればいいのではないでしょうか
kamisan

2017/02/13 03:49

ふむふむ。。。 この場合だと他のスクリプトからの呼び出しなどは可能ですか。。。?
YAmaGNZ

2017/02/13 04:13

他のスクリプトからというのは、playerクラスの外からということでしょうか? 上記はOnTriggerExit2D内の処理をこうすればという案なので、その関数の定義しだいだと思います。 また、Playerクラスの外から状態を変更させるのであれば、そのようなメソッドを用意する等 設計したほうがいいと思います。
kamisan

2017/02/13 04:58

Playerクラス外ですっ ふむふむ。。。 上記のような場合でEnemyに当たると  case 1 のtwostepの画像にならないのはどうしてなのでしょうか。。。?
YAmaGNZ

2017/02/13 05:23

説明がマリオとのことだったので、turbgraphics200さんと同様に、敵に当たった場合、一気に元に戻しています。 case "Enemy":     playerstatsu--;     break; とすれば、一段階づつ戻るようになるかと ステップ実行できるようにして、ソースがどのように動作しているか確認するといいと思います。 外部から呼ぶのであれば public void statuschange(int status) {   playerstatus = status;   switch(playerstatus)     case 0:       MainSpriteRenderer.sprite = onstage;       break;     case 1:       MainSpriteRenderer.sprite = twostep;       break;     case 2:       MainSpriteRenderer.sprite = Threestages;       break;   } } のようにして、 player.statuschange(1); みたいに呼び出すとか (この実装が適切なのかは別として、public関数を宣言すれば、クラスの外から呼び出せます)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問