Unity 2Dでサイコロを作る
こういうの作ります。
3Dのサイコロを作る方法はいくつか他サイトで公開されていて、2Dのサイコロも同じようにしてすぐ作れるだろうと思っていたら、思いの外苦労したのでその過程を記録しておくことにしました。
制作過程
まずはサイコロの各面の画像を適当に用意します。 今回はいつもお世話になっているicooon-mono様の画像をお借りし、それを加工したものを用意しました。
画像はフォルダにまとめ、Resources.LoadAll<Sprite>()
で読み込むと便利です。
サイコロを振っている間はランダムに画像を変更するようにし、スクリプトのUpdate内に処理を書きます。
あとはサイコロのImageにrigidbodyとイベントトリガーを取りつけ、クリックで鉛直上方向にAddForceを加え、振っている感じを出します。
サイコロのImageの下に床となるコライダーをつけたオブジェクトを用意するのを忘れずに。
コードは以下の通りです。
using UnityEngine; using UnityEngine.UI; using DG.Tweening; public class DiceManager : MonoBehaviour { public GameObject dice; Rigidbody2D rb2D; private Image diceImage; private int preNum; float posY; Sprite[] images; private bool isRandom = false; void Start() { diceImage = dice.GetComponent<Image>(); rb2D = dice.GetComponent<Rigidbody2D>(); images = Resources.LoadAll<Sprite>("DiceImage"); } void Update() { if (isRandom) { if (!rb2D.IsSleeping()) { int num = Random.Range(0, 6); diceImage.sprite = images[num]; preNum = num; } else { Debug.Log(preNum + 1); isRandom = false; } } } //クリックで呼ぶ public void OnClickDice() { if (rb2D.IsSleeping() && !isRandom) { rb2D.AddForce(new Vector2(0f, 1000f)); isRandom = true; } } }
このままでも一応動くのですが、デフォルトだと非常にゆっくりした感じになってテンポが悪いので、 RigidBody2DのGravity Scaleを大きくしてサイコロが早く動くようにします。 またX軸方向の動きや回転を制限するため、Freeze Position XとFreeze Rotation Zにチェックを入れます。
注意してほしいのが、Linear DragとAngular Dragの値が1になっていることです。 これがデフォルト値のままだと、Gravity Scaleを大きくしたときにサイコロが微振動するようになり、 見た目も気持ち悪い上にサイコロの静止判定がとれなくなって困ります。 あとCollision DetectionもContinuousに変更する必要があったりで、ここらへんの設定にかなり苦労しました。
最後に、RigidBody 2dの静止判定をIsSleeping()
メソッドでとる部分についてですが、
これもデフォルトの設定だとサイコロが止まってからも少しの間サイコロの画像が変わり続けるので、
Project Settings>Physics 2D
からTime To Sleepの値を変更します。
これでようやく満足の行く2Dサイコロが作れました。思っていた3倍は苦労しました。