makeagame’s blog

UnityとVroidに関する情報を掲載しています。

Unity ブログ -オブジェクトの表示と非表示の話-

このブログでわかること
・unityの基礎用語
・unityで躓きやすいカメラにいて
・unityで躓いたら見て欲しいところ
 
このブログはこんな方向け!
・Unity辞めたって人
・Unityやってみたいって人
・ゲーム作りに興味がある人
 
今回のメインはUnityゲームのオブジェクトを表示したり非表示したりのお話です。
 
私はブロック崩しのゲームを作ってみたいなぁ~と思って色々調べて作ってみまして……。
 
色々張り切っちゃいましたよね。
よくブロック崩しといえば自機はただの棒でちょっと面白味ないよねーってなったらすぐにキャラクター出してアニメーション付けて遊んだり……。
 
(参照動画)
 
 
で、見ていただきたいのが、オブジェクトの表示/非表示のところです。
別動画になりますが、こちらをご覧ください。

(動画参照)
 
この動画では、とあるオブジェクト(スフィア)に当たると順繰りにエフェクトオブジェクト(吹き出し)が表示されるというものです。順番は「♡」→「♪」→「☆」→「なし」となり当たり続ける限りめぐっていきます。
 
ちょっとした面白要素ですね。これ、プログラミングだと意外と重要な考え方を応用して実現させております。難しい方だとSin関数使ったりするらしいですが、もっと簡単な手法をしておりまして、昔これの使い方を教えてもらったときは「なるほど~」と思ったのでご紹介します。

 

考え方

  1. スフィアにボールが当たる
  2. エフェクトを表示させる
  3. エフェクトを変える

みたいなざっくりとした考えとなりますが、そこからどうスクリプトに組み込むかを考えていきます。

 

で、私が考えたのがスフィアに当たった回数を保存させて、その当たった回数に応じてエフェクトオブジェクト(吹き出し)を変えて表示するというものでした。

 

この考え方が一番わかりやすいですね。

 

で、いつスフィアにボールが当たってもいいようにUpdate関数に入れていきます。

で、完成したスクリプトがこちらです。

 

    int HitCount = 0;
    int Hitcal = 0;

    public GameObject balleffect;
    public GameObject emotionheart;
    public GameObject emotionnote;
    public GameObject emotionstar;

 

 void Update()
    {
        Hitcal=HitCount%4;
        if(Hitcal == 1)
        {
            emotionheart.GetComponent<heartappear>().heartActive();
            emotionnote.GetComponent<noteappear>().noteHide();
            emotionstar.GetComponent<starappear>().starHide();
        }
        else if(Hitcal == 2)
        {
            emotionheart.GetComponent<heartappear>().heartHide();
            emotionnote.GetComponent<noteappear>().noteActive();
            emotionstar.GetComponent<starappear>().starHide();
        }
        else if(Hitcal == 3)
        {
            emotionheart.GetComponent<heartappear>().heartHide();
            emotionnote.GetComponent<noteappear>().noteHide();
            emotionstar.GetComponent<starappear>().starActive();
        }
        else
        {
            emotionheart.GetComponent<heartappear>().heartHide();
            emotionnote.GetComponent<noteappear>().noteHide();
            emotionstar.GetComponent<starappear>().starHide();
        }
    }

 

    private void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject == balleffect)
        {
            HitCount++;
        }
    }

1つずつこのスクリプトを見ていきますね。

肝となるのがここの部分「HitCount%4

」の計算……これは割り算をしております。

 

しかもただの割り算ではありません。

割り算した結果のあまりを計算するのです。

なのでこの式の場合、値は絶対に「0」「1」「2」「3」のどれかになるわけです。

 

今回のスクリプトの場合スフィアがボールに当たって、当たった回数が「1」になったら、ハートマークのエフェクトオブジェクトが表示されます。当たった回数が「2」になれば、ハートマークが消えて、音符マークに切り替わります。当たった回数が「3」になれば、音符マークから星マークに切り替わり、最後4回当たったら、割り算の計算結果は「0」。そうなったらすべてを非表示になります。元の数字は「0」なので、初期化するという意味も含めて、「0」の時にすべて非表示の方が都合がいいですね。

 

スフィアにボールが何度当たっても4つの値のどれかにしかならないんですよね。

この考え方をしっかり身に着けられるかどうかで思いついたことが実行できるかできないか結構分れる(気がする)んですよね。

 

後はif文で条件付けしちゃえば順番通りにエフェクトオブジェクトが切り替わっていくという寸法です。

if文内は関数を割り当て、目当てのエフェクトオブジェクトを表示させ、他を非表示させているだけですね。starHide()とかstarActive()内の関数はそのままSetActive関数を用いてtrue/falseで管理しております。

 

動画内ではスフィアの色も変えておりますが、このif文内に付けてたりもしてますね。

GetComponent<Renderer>().material.color = Color.red;

と書くことで、マテリアル内のカラーを変更(この場合は赤に)することができます。

 

で、スフィアにボールが何回当たっているかを、 OnCollisionEnter関数で計算しております。

 

長いですが、かなりわかりやすく、自分で把握しやすくなるんですよね。

 

自分で書いたスクリプトでも、結構他からそのままコピペして、結果見返してみても訳がわからないということになることが多いです。

 

しっかりコメントとか残すのがいいと思います。

(Unity内だと日本語が文字化けしてしまってなんか嫌になっちゃうんですけどね。)

 

今回のお話はここまでです。

割り算の考え方の例をご紹介しました。

「%」こいつは結構使えるのでぜひとも参考にしていただければ幸いです。