【Unity】ベイブレード風のコマ対戦を再現してみた
こんにちは、をる(@wol_gamedev)と申します。
Unityでベイブレードのような挙動を再現してみました。
作成した手順をまとめましたので紹介します。
1.概要
・以下の動画のようなものを作成していきます。
Unityでベイブレードっぽいコマ対戦を再現してみたよ
— をる (@wol_gamedev) July 17, 2024
意外とリアル pic.twitter.com/OLYEcX5aHu
2.モデルの準備
CGTraderというサイトから、ベイブレードとステージのモデルをダウンロードします。どちらも無料です。すごい。
・ベイブレードモデル
・ステージモデル
ダウンロードしたら、ゲームにインポートしておきます。
3.オブジェクトの配置
・まずシーンに、インポートしたステージのモデルと、球体オブジェクトを配置します。名前はStageと1PSphereとしました。
・ステージにはMesh Colliderを追加しておきます。球体にはSphere ColliderとRigidBodyを追加しておきます。
・球体の初期位置は、ステージの上に浮かせて配置しておきましょう。
床も配置するといい感じ
・次に、ステージに物理マテリアルを設定します。
Create ->Physic Materialを選し、以下の画像のように設定します。
これをステージのMesh Collider の Materialに設定します。
これで、ステージ上の摩擦がゼロになります。再生すると球体がステージの上を滑ることが確認できます。
・球体(1PSphere)にもPhysic Materialを以下のように設定し、Sphere Collider の Materialに設定します。
これで配置ができました。
4.当たり判定の実装
・球体(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にすべてチェックをしておきます。これをすることでベイブレードが縦回転しなくなります。
・球体のメッシュをオフにすると、以下の画像のようになります。マテリアルは自由に設定してください。
・次に、以下のスクリプトを作成し、ベイブレードのモデル(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ベイブレードも出来るんですね!
写真やコードなどを付けて再現性が高い状態で公開してくださってありがとうございます!