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

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

ただいまの
回答率

90.53%

  • C#

    7076questions

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

  • Unity2D

    874questions

Unity Sprite変換

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 563

kamisan

score 13

実現したいこと

Box Collider2Dで当たったらSpriteを変える

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

該当のソースコード

public class Player : MonoBehaviour {

    SpriteRenderer MainSpriteRenderer;
    // Spaceshipコンポーネント
    Spaceship spaceship;

    public Sprite onestage;
    public Sprite twostep;
    public Sprite Threestages;


    IEnumerator Start()
    {

            MainSpriteRenderer = gameObject.GetComponent<SpriteRenderer>();


    }

    void Update()
    {

    }
    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)
    {
        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文で試したところ同じ結果です。。。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

public class Player : MonoBehaviour {
  // 現在どのステップかを保持
  int step = 0;
  //あとステップごとのスプライトを配列として保持
  Sprite[] stepSplites = new Sprite[] {nomalSplite, superSplite, hyperSplite}; 

  void OnTriggerExit2D(Collider2D other) {
    if(other.tag == "item") step = Math.Min(1, step + 1); // アイテムならステップを増やす(Max 1)
    else if(other.tag == "Enemy") step = Math.Max(0, step - 1); // 敵に当たれば逆にステップを減らす(Min 0)
    MainSpriteRenderer.sprite = stepSplites[step];  // ステップのスプライトを適用
  }
}


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/13 12:46

    ふむふむ。。。この場合だと tagで当たり判定と画像の呼び出しができるんですかっ

    var step は  void OnTriggerExit2D の外にあるとなぜかエラーを出されて実行できないのですが
    内側に入れるとエラーがなくなるのはなぜなんでしょう。。。?

    後、自分の説明不足でした。。。敵に当たっても1段階ずつステップダウンさせたいです
    そのようにするには  if(other.tag == "Enemy") step--; でできますか?

    キャンセル

  • 2017/02/13 12:48 編集

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


    ええ、stepp--;で対応可能と思います。

    キャンセル

  • 2017/02/13 13:38

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/13 11:43 編集

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

    キャンセル

  • 2017/02/13 12: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;
    }

    といった感じで実装すればいいのではないでしょうか

    キャンセル

  • 2017/02/13 12:49

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

    キャンセル

  • 2017/02/13 13:13

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

    キャンセル

  • 2017/02/13 13:58

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

    キャンセル

  • 2017/02/13 14: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関数を宣言すれば、クラスの外から呼び出せます)

    キャンセル

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    7076questions

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

  • Unity2D

    874questions