動画のように動く床の作りかた、プレイヤーを動く床と一緒に動かす方法を書いていきます。
動画ではキャラクターと床が一緒に動いていますね。
この記事では動く床の作り方とキャラクターを床と一緒に動かす方法が書いてありますが、動く床がすでにできているという人は目次から「動く床とキャラクターを一緒に移動させる」から見てください。
目次
動く床の作り方
床を作りスクリプトで動かせるようにする
動画のように床を動かせるようにします。
ヒエラルキーから「キューブ」を追加します。
キューブの大きさを調整して使いたい床のサイズに変更します(画像赤丸)。
新しくスクリプトを作り以下のコードを貼り付けます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
float x = 0.1f;
// Start is called before the first frame update
void Start()
{
Invoke("Swith2", 0f);
}
// Update is called once per frame
void Update()
{
Vector3 p = new Vector3(x, 0, 0);
transform.Translate(p);
}
void Swith()
{
x = 0.1f;
Invoke("Swith2", 2.0f);
}
void Swith2()
{
x = -0.1f;
Invoke("Swith", 2.0f);
}
}
コードの説明
このスクリプトでは床が動くようにコードを書いています。
スクリプトの7行目にはxという変数が書かれています。xの数値は0.1で、この0.1が床の移動スピードになります。
スクリプトの11行目、「void Start」の中には「Invoke(“Swith2”, 2.0f);」というコードが書かれています。これは指定した時間が経過するとその関数の処理を行うということで、この場合は2.0fつまり2秒後に””内の「Swith2」という関数の処理を行うという意味になります。「Swith2」は25行目にありますね。
17行目では「Vector3 p = new Vector3(x, 0, 0);」というコードが入っています。 Vector3の()内の3つの数字はそれぞれX方向、Y方向、Z方向を表しており、X方向に先ほど作った変数xを入れているのでこの場合X方向にxずつ、つまり0.1ずつ進んでいくことになります。
20行目と25行目にそれぞれ「void Swith」、「void Swith2」という関数があります。「void Swith」にはxを0.1fにするコード、「void Swith2」にはxを−0.1fが書いてあり、それぞれ先ほど出てきた「Invoke」というコードが書いてあります。−0.1fは逆方向に移動していくのでxが−0.1fになれば床は逆方向に移動します。そしてそれぞれInvokeにより2秒後に「void Swith」と「void Swith2」を繰り返していきます。つまり初めはX方向に0.1fずつ移動し、2秒後に−0.1fずつ、つまり逆方向に動いていき、2秒後に0.1fずつ進んでいくので床が行ったり来たりするようになります。
スクリプトができたら左クリック長押しで動く床にスクリプトを読み込みます(画像赤矢印)。
赤丸のように表示されればOKです。
動画のように床が動けばOKです。
スクリプトをいじってみる
スクリプト17行目のxの場所を変えることで動く位置を変更できます。
Vector3 p = new Vector3(x, 0, 0);
xの位置を真ん中にすると上下に動きます。
Vector3 p = new Vector3(0, x, 0);
Vector3 p = new Vector3(0, 0, x);
また、7行目の数値(0.1)を変えることで床の移動速度を変化できます。
float x = 0.1f;
11、23、28行目の数値(2.0)を変更すると床の移動が切り替わる(右から左に切り替わる)までの時間を調整できます。
Invoke("Swith2", 2.0f);
動く床とキャラクターを一緒に移動させる
床を複製する
動く床にキャラクターが乗ったとき動画のように動きが一緒にならず落ちてしまう場合の解決方法を書きます。
動く床を右クリックして複製を選びます(画像赤丸)。
動画のように複製した床をほんの少しだけ上にあげます。
複製した床は動く床の子にします。(複製した床を左クリック長押しで床にドロップするとできます)下の一枚目の画像のように表示されればOKです。
さらに複製した床には以下の操作をしてください。
・Mesh Rendererのチェックを外す(下の画像1参照)
・「トリガーにする」にチェックを入れる(下の画像1参照)
・複製した床についているスクリプトを消す。(下の画像2参照)
画像1
画像2
タグをつける
複製した床を選び、右上から「タグ」をクリックします。
そして表示された項目から一番下の「タグを追加」をクリックします(画像赤丸)。
新しいタグをつけることができるので、名前を「floor」にしてください(画像赤丸)。
再びタグをクリックすると先ほど追加した「floor」があるのでタグをそれに変更します(画像赤丸)。
スクリプト
新たにスクリプトを作り、名前を「collision」とします。
できたら以下のコードをコピー&ペーストしてください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class collision : MonoBehaviour
{
public GameObject floor;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
void OnTriggerEnter(Collider col)
{
if (col.tag == "floor")
{
this.gameObject.transform.parent = floor.gameObject.transform;
}
}
void OnTriggerExit(Collider col)
{
if (col.tag == "floor")
{
this.gameObject.transform.parent = null;
}
}
}
スクリプト説明
このスクリプトではキャラクターが動く床の上に乗ると親子関係になり、床から出ると親子関係を解除するようにします。親子関係となっている間は子は親と同じ動きをするので操作キャラを床の子にするとキャラは床と同じ動きをします。
8行目で「public GameObject floor;」と書いています。この「floor」を動く床にしています。
21行目の「void OnTriggerEnter(Collider col)」は当たり判定となっていて、この中に処理を書くことで対象のタグに触れた時に処理を行うことができます。
23行目に「floor」というタグを書いています。25行目にはfloorの子になるコードが書かれており、これによりfloorというタグに触れるとfloorの子になります。floorというタグは先ほど作りましたね。
28行目の「void OnTriggerExit(Collider col)」は当たり判定で、指定したタグから離れた時に中の処理を行うようになっています。
中の30行目にはfloorタグが書かれており、このタグから離れると32行目の処理を行います。32行目にはfloorの親子関係を解除する処理が書かれており、これにより動く床から離れると解除されます。
スクリプトを操作キャラクターにつけます(画像短い矢印)。
スクリプトにFloorという欄があるので、複製した床を左クリック長押しでドロップします(画像長い矢印)。
これでキャラクターが床の上に乗ったとき床と一緒に動きます。
同じ方法で上下に動く床や回る床が作れます。エレベーターなどを作る際に使えるのでぜひ試してみてください。
コメントを残す