【ハルシオンブログ】3Dサイコロを転がして、出目を確認してみる。これで無限サイコロができるぜ!
こんにちは。坂内っす。
ポケガ3の開発進んでますよー ということで、SSを1枚ツイートさせて頂きました。
ちょっと1,2よりステータスが細かいところがありますが、基本は1,2通りなのであんまり気にしないでもイイかもしれません。
まだ調整してないですが・・・・
さて、Unityでサイコロ生成してみました。
ちゃんと出た目も判定するようにします。
まずは、アセットストアから無料のサイコロをゲット。
https://assetstore.unity.com/packages/3d/props/tools/dice-d6-game-ready-pbr-200151
まずはPlaneだけを置いたシーンを用意。

スペースキーを押した時にサイコロが出るようにします。
[Blog20220207.cs]
dicePrefabには先ほどのダイスのオブジェクトをアサインします。
これでサイコロが出ますね。

毎回2が上向きで落ちてきますね・・・・
回転をランダムでつけてみましょう。
サイコロに以下のコードを付けます。
[Dice.cs]
これでランダムな向きでおちてくるようになりました。

っぽくなってきました。
それでは、サイコロの動きが止まったときにどの目が出ているのかを取得するようにしましょう。
いくつかやり方はあると思いますが、サイコロの各面の中心にオブジェクトをつけて、”どのオブジェクトが一番上にあるのか”で判定してみたいと思います。
この方法をとった理由としては、サイコロ同士が重なったりして斜めになった時でも取得できるかと思ったからです。
さて、やっていきましょう。

こんな感じで、サイコロに空のGameObjectを6個つけました。
dice1 - X:0 Y:0 Z:1
dice2 - X:0 Y:1 Z:0
dice3 - X:-1 Y:0 Z:0
dice4 - X:1 Y:0 Z:0
dice5 - X:0 Y:-1 Z:0
dice6 - X:0 Y:0 Z:-1
これらのオブジェクトのtransform.position.yが一番上にあるかで判定します。
[Dice.cs]
rigidbody.IsSleeping()で「止まった時」を判断できます。

こんな感じで、サイコロの動きが止まった時に出目をログに出してみました。
という感じで、簡単にサイコロを作ってみました。
ちょっとCheckDiceのところをUpdateでやっているので、そこもっとイイ感じにできそうな気もします。
ということで、あでゅ~ノシ
ポケガ3の開発進んでますよー ということで、SSを1枚ツイートさせて頂きました。
ポケガ3なんとか形になってきてます。
— ざぼさま@㈱ハルシオンシステム (@Zabosama) February 4, 2022
今年中には絶対だすんでお待ちをば。
ラフ1枚だしときますね。
(ポケガ3のSS初公開)
これが最後のつぶやきにならないように・・・・ pic.twitter.com/Sq8ooNfzVx
ちょっと1,2よりステータスが細かいところがありますが、基本は1,2通りなのであんまり気にしないでもイイかもしれません。
まだ調整してないですが・・・・
さて、Unityでサイコロ生成してみました。
ちゃんと出た目も判定するようにします。
まずは、アセットストアから無料のサイコロをゲット。
https://assetstore.unity.com/packages/3d/props/tools/dice-d6-game-ready-pbr-200151
まずはPlaneだけを置いたシーンを用意。

スペースキーを押した時にサイコロが出るようにします。
[Blog20220207.cs]
using UnityEngine;
public class Blog20220207 : MonoBehaviour
{
[SerializeField] Dice dicePrefab;
void Start()
{
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space)) {
if (diceCount < maxDice) {
Instantiate(dicePrefab, new Vector3(0, 5, 0), Quaternion.identity);
}
}
}
}
dicePrefabには先ほどのダイスのオブジェクトをアサインします。
これでサイコロが出ますね。

毎回2が上向きで落ちてきますね・・・・
回転をランダムでつけてみましょう。
サイコロに以下のコードを付けます。
[Dice.cs]
using UnityEngine;
public class Dice : MonoBehaviour
{
void Start()
{
transform.rotation = Random.rotation;
}
}
これでランダムな向きでおちてくるようになりました。

っぽくなってきました。
それでは、サイコロの動きが止まったときにどの目が出ているのかを取得するようにしましょう。
いくつかやり方はあると思いますが、サイコロの各面の中心にオブジェクトをつけて、”どのオブジェクトが一番上にあるのか”で判定してみたいと思います。
この方法をとった理由としては、サイコロ同士が重なったりして斜めになった時でも取得できるかと思ったからです。
さて、やっていきましょう。

こんな感じで、サイコロに空のGameObjectを6個つけました。
dice1 - X:0 Y:0 Z:1
dice2 - X:0 Y:1 Z:0
dice3 - X:-1 Y:0 Z:0
dice4 - X:1 Y:0 Z:0
dice5 - X:0 Y:-1 Z:0
dice6 - X:0 Y:0 Z:-1
これらのオブジェクトのtransform.position.yが一番上にあるかで判定します。
[Dice.cs]
using UnityEngine;
public class Dice : MonoBehaviour
{
[SerializeField] Rigidbody rb;
[SerializeField] GameObject[] diceFaces;
bool isCheck;
void Start()
{
transform.rotation = Random.rotation;
}
void CheckDice() {
if (rb.IsSleeping()) {
int topIndex = 0;
float topVal = diceFaces[0].transform.position.y;
for(int i = 1; i < diceFaces.Length; i++) {
if (diceFaces[i].transform.position.y > topVal) {
topIndex = i;
topVal = diceFaces[i].transform.position.y;
}
}
Debug.Log(topIndex + 1);
isCheck = true;
}
}
void Update()
{
if (!isCheck) {
CheckDice();
}
}
}
rigidbody.IsSleeping()で「止まった時」を判断できます。

こんな感じで、サイコロの動きが止まった時に出目をログに出してみました。
という感じで、簡単にサイコロを作ってみました。
ちょっとCheckDiceのところをUpdateでやっているので、そこもっとイイ感じにできそうな気もします。
ということで、あでゅ~ノシ
Category: 開発日記(Unity)
« 【ハルシオンブログ】Unityでカラープリセット使ってますか? | 【ハルシオンブログ】Unity2021.2でDictionaryにメソッドが増えたんですね »
コメント
| h o m e |