見出し画像

【Unity】ベイブレード風のコマ対戦を再現してみた

こんにちは、をる(@wol_gamedev)と申します。
Unityでベイブレードのような挙動を再現してみました。

作成した手順をまとめましたので紹介します。

1.概要

・以下の動画のようなものを作成していきます。



2.モデルの準備

CGTraderというサイトから、ベイブレードとステージのモデルをダウンロードします。どちらも無料です。すごい。

・ベイブレードモデル

・ステージモデル

ダウンロードしたら、ゲームにインポートしておきます。


3.オブジェクトの配置

・まずシーンに、インポートしたステージのモデルと、球体オブジェクトを配置します。名前はStage1PSphereとしました。

・ステージにはMesh Colliderを追加しておきます。球体にはSphere ColliderとRigidBodyを追加しておきます。

・球体の初期位置は、ステージの上に浮かせて配置しておきましょう。

画像
配置イメージ
床も配置するといい感じ


・次に、ステージに物理マテリアルを設定します。
Create ->Physic Materialを選し、以下の画像のように設定します。

画像
ステージ用の物理マテリアルを設定

これをステージのMesh Collider の Materialに設定します。

画像
ステージのコライダーのマテリアルに設定

これで、ステージ上の摩擦がゼロになります。再生すると球体がステージの上を滑ることが確認できます。

画像
ステージを滑る球体


・球体(1PSphere)にもPhysic Materialを以下のように設定し、Sphere Collider の Materialに設定します。

画像
球体用の物理マテリアル
画像
球体のコライダーの物理マテリアルに設定

これで配置ができました。


4.当たり判定の実装

・球体(1PSphere)にタグを設定します。今回は"Sphere"というタグを追加して付けました。

画像
球体(1PSphere)のタグを"Sphere"に設定

・次に、衝突を判定するスクリプトを作成します。

CollisionManager

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CollisionManager : MonoBehaviour
{
    private Rigidbody _rb;
    //乱数
    private float _rnd;
    [Header("乱数最小値")]
    public float _rndMin = 0.9f;
    [Header("乱数最大値")]
    public float _rndMax = 1.2f;

    private void Start()
    {
        //RigidBodyコンポーネント所得
        _rb = this.GetComponent<Rigidbody>();
    }

    //衝突したときに呼ばれる関数
    private void OnCollisionEnter(Collision collision)
    {
        //Sphereタグがついたものにぶつかったら
        if (collision.gameObject.CompareTag("Sphere"))
        {
            //乱数生成
            _rnd = Random.Range(_rndMin, _rndMax);
            //加速させる
            _rb.velocity *= _rnd;
        }
    }
}


これを球体(1PSphere)にアタッチします。

これで、球体が"Sphere"というタグが付いたオブジェクトに衝突したときに弾かれる、という処理ができました。

・追加で、重力を増幅するスクリプトを作成し、同様に球体(1PSphere)にアタッチします。重力を大きくすればするほどベイブレードがステージ上を移動するスピードが上がります。

AdjustGravity

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AdjustGravity : MonoBehaviour
{
    [Header("重力の倍率")]
    public float _gravityScale = 8f;

    void Start()
    {
        //重力を増幅
        Physics.gravity = new Vector3(0f, -9.81f * _gravityScale, 0f);
    }
}

これでベイブレードの当たり判定の準備ができました。


5.ベイブレードを回転させる

・インポートしておいたベイブレードのモデルを、球体(1PSphere)の子オブジェクトとして配置します。名前はBeybladeとしました。

画像
球体の子オブジェクトとしてベイブレードモデルを配置


・このままだとベイブレードが隠れているので、球体(1PSphere)のMesh Rendererをオフにします。

また、RigidBodyのFreeze Rotationにすべてチェックをしておきます。これをすることでベイブレードが縦回転しなくなります。

画像
Mesh Rendererのチェックを外し、RigidBodyのFreeze Rotationにすべてチェック


・球体のメッシュをオフにすると、以下の画像のようになります。マテリアルは自由に設定してください。

画像
ベイブレードの配置イメージ


・次に、以下のスクリプトを作成し、ベイブレードのモデル(Beyblade)の方にアタッチします。

RotateManager

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotateManager : MonoBehaviour
{
    //ベイブレードのオブジェクト
    [SerializeField] GameObject _beyblade;
    [Header("回転数")]
    public float _rotateValue = 200;

    private Vector3 _rotateVec;
    
    void Start()
    {
        _rotateVec = new Vector3(0, 0, _rotateValue);
    }

    void Update()
    {
        _beyblade.transform.Rotate(_rotateVec);
    }
}

15行目の "_rotateVec = new Vector3(0, 0, _rotateValue); "ではz軸中心に回転させようとしていますが、これはベイブレードモデルの初期設定がx軸に-90度回転していたためです。

これで、準備ができました。


6.対戦

球体を複製して、適当な場所に移動させて再生してみましょう。

画像
うおお

これで、ベイブレード風のコマ対戦ができました!

各所のpublicで設定した変数を変更することで、いろんなパターンのベイブレードができると思います!


いいなと思ったら応援しよう!

コメント

1

スゲェ! Unityベイブレードも出来るんですね!

写真やコードなどを付けて再現性が高い状態で公開してくださってありがとうございます!

ログイン または 会員登録 するとコメントできます。
ゲーム制作始めました!/Unity
【Unity】ベイブレード風のコマ対戦を再現してみた|をる
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1