【山崎研Tips】Unityの当たり判定:サンプル②接触したブロックに応じて異なる数の新しいブロックが出現
https://scrapbox.io/files/672db3b977a4e165bd71999c.mp4
1. はじめに
研究室では現在(2024年度)「格闘技を理解するAI」の開発に取り組んでいます。その一環で、柔道の形(かた)のVRトレーニングシステムを開発しています。そのために必要になるUnityでの当たり判定に関して、下記の2つのサンプルを用意しました。
サンプル2:プレーヤーがブロックと接触するとそのブロックが消え、接触したブロックに応じて異なる数の新しいブロックが出現する。(上の動画。このページの内容です。)
※サンプルプロジェクトはドライブの 開発資料\Unity\衝突判定サンプルに置いてあります。
2. 参考
こちらを読んでいない方は、先にこちらを確認してください。前提などを説明しています。
3. Unityの当たり判定:サンプル②接触したブロックに応じて異なる数の新しいブロックが出現
4.1 やること
https://gyazo.com/d79875c719075a8c96b2e6ec62963b67
ボール(Player)とブロックの接触を判定する
白ブロックに接触するとブロックが消え、次のブロックが1つ現れる
New! 赤ブロックに接触するとブロックが消え、次のブロックが2個現れる
New! 黒ブロックに接触するとブロックが消えるが、次のブロックは現れない
4.2 手順
a. Cube_3、Cube_4、Cube_5はY=2の位置に、 Cube_6、Cube_7、Cube_8はY=4の位置に指定。各位置と番号の対応は上の図を参照。
b. 上の図を参照してタグを次のとおりに指定
白(Cube_0, 1, 4, 5, 8)はBlock_plus1
赤(Cube_2, 6)はBlock_plus2
黒(Cube_3, 7)はBlock_plus0
(説明のためCubeの色を変えてますが、色は変えなくてもよいです)
Step2 BlockSpawn.csを下記の通り修正
a. GameObjectのprefabArrayのサイズを9と入力し、Cube_3からCube_8を追加する
b. 9個目のブロックの次は1個目のブロックが再び出現するように変更してます(深い意味はないです)
code:BlockSpawn.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BlockSpawn : MonoBehaviour
{
public static BlockSpawn instance;
public GameObject[] prefabArray;
public void Awake()
{
if(instance == null)
{
instance = this;
}
}
void Start()
{
}
public void Generate()
{
if(PlayerScript.instance.count < 9)
{
}
else{
PlayerScript.instance.count = 0;
}
}
}
Step3 PlayerScript.csを下記の通り修正
a. "Block_plus0"、"Block_plus1"、"Block_plus2"のタグによって、出現させるブロックの数をかえています。
b. プレーヤーに上下の移動も追加しました。
code:PlayerScript.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerScript : MonoBehaviour
{
public static PlayerScript instance;
public int count;
public void Awake()
{
if(instance == null)
{
instance = this;
}
}
// Update is called once per frame
void Update()
{
float x = Input.GetAxisRaw("Horizontal") * Time.deltaTime * 2;
transform.position += new Vector3(x, 0, 0);
if (Input.GetKey(KeyCode.LeftShift))
{
transform.Translate(-0.1f, 0f, 0f);
}
if (Input.GetKey(KeyCode.RightShift))
{
transform.Translate(0.1f, 0f, 0f);
}
if (Input.GetKey(KeyCode.UpArrow))
{
transform.Translate(0f, 0.005f, 0f);
}
if (Input.GetKey(KeyCode.DownArrow))
{
transform.Translate(0f, -0.005f, 0f);
}
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("Block_plus0"))
{
Destroy(other.gameObject);
}
if (other.gameObject.CompareTag("Block_plus1"))
{
Destroy(other.gameObject);
count++;
BlockSpawn.instance.Generate();
}
if (other.gameObject.CompareTag("Block_plus2"))
{
Destroy(other.gameObject);
count++;
BlockSpawn.instance.Generate();
count++;
BlockSpawn.instance.Generate();
}
}
}
以上です。
https://gyazo.com/71c7de59f100448c29cdb7f29fbd171b