FC2ブログ
    11 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 01

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】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]

    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)

    tb 0 : cm 0   

    コメント

    コメントの投稿

    Secret

    トラックバック

    トラックバックURL
    →http://halcyonsystemblog.jp/tb.php/861-13d4f3c0
    この記事にトラックバックする(FC2ブログユーザー)