Unity ブログ -オブジェクトの表示と非表示の話-
考え方
- スフィアにボールが当たる
- エフェクトを表示させる
- エフェクトを変える
みたいなざっくりとした考えとなりますが、そこからどうスクリプトに組み込むかを考えていきます。
で、私が考えたのがスフィアに当たった回数を保存させて、その当たった回数に応じてエフェクトオブジェクト(吹き出し)を変えて表示するというものでした。
この考え方が一番わかりやすいですね。
で、いつスフィアにボールが当たってもいいように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内だと日本語が文字化けしてしまってなんか嫌になっちゃうんですけどね。)
今回のお話はここまでです。
割り算の考え方の例をご紹介しました。
「%」こいつは結構使えるのでぜひとも参考にしていただければ幸いです。