OnTriggerEnterを使って、別のオブジェクトにマテリアルを貼り付ける方法
TETRY 3Dに使われている技術
今回からスクリプトについて説明していきたいと思います。誰でも知っているようなこともあるかと思いますが、個人的なメモのようなものも兼ねています。
コンテンツ
準備
下がマテリアルを受け取る側(白色)で「Acube」とします。
上が動かす側(赤色)で「Bcube」と命名します。
まずはOnTriggerEnterを使うための準備です。
イベントを受け取る側のBox Colliderコンポーネントの中のis Triggerにチェックを入れます。
次に動かす側のインスペクターにRigidBodyを追加します。
それからタグも作成して追加しておきます。
Add Tagを選択して、
list is Enptyの右にある+ボタンを押します。
名前を入力するところが出てくるので、ここでは「Bcube」と入力しました。
それからBcubeを動かすスクリプトも用意しておきます。
public class move : MonoBehaviour
{
// Update is called once per frame
void Update()
{
PressX();
}
void PressX()
{
if (Input.GetKeyDown(KeyCode.X)){
Debug.Log("keyDownX");
transform.position = new Vector3(transform.position.x, 0.05f, transform.position.z);
}
}
}
このスクリプトをBcubeに追加します。
実装
次にメインとなるマテリアルの複製です。
以下のコードを作成し、Acubeに貼り付けます。
public class imitate : MonoBehaviour
{
private Renderer targetRend;
private Renderer myRend;
// Start is called before the first frame update
void Start()
{
myRend = GetComponent<Renderer>();
}
void OnTriggerEnter(Collider collider)
{
if (collider.gameObject.tag == "Bcube")
{
Debug.Log("catchB");
myRend.enabled = true;
targetRend = collider.GetComponent<Renderer>();
myRend.material = targetRend.material;
}
}
}
targetRendはBcubeのRenderer用でmyRendはAcube用になります。
Start()で自身のRendererを取得します。
OnTriggerEnterはRigidBodyを持つオブジェクトのコライダーが接触してきたとき開始されます。
引数には相手のColliderが格納されています。
今回は先に登録したBcubeというタグを持つオブジェクトのみ処理を行います。
17行目はRendererを有効にしています。予めAcubeのMesh Rendererのチェックを外して見えない状態にしていても、Bcubeが接触することで可視状態になります。
18行目でcolliderからBcubeのMaterialなどの情報が入ったRendererをtargetRendに格納します。
19行目でmyRendのマテリアルにtargetRendのマテリアルを貼り付けます。
実際に動かしてみる
ゲームを再生してXキーを押すと、BcubeがAcubeの中へ移動して赤いマテリアルが適用されます。
使用方法あれこれ
TTETRY 3Dで実際に使っているスクリプトですが、基本的な表示方法として使っています。サンプルの通りに小さなブロックが本体で、並べられた大きなブロックを通過することで大ブロックが移動しているような表示になります。
これとは別にOnTriggerExitでRenererをfalseに戻しています。
OnTriggerStayの中にもスクリプトを書くことでいろいろな処理へ分岐させることができます。
以上で第一回TETRY 3Dに使われている技術でした。
ご精読ありがとうございました。
0件のコメントを表示