トリガーを判定に使ってフラグを管理し、フラグがTrueの時だけなんかする、という処理の実装です。
ここでは「接地してる間はジャンプできる」という処理を実装します。
成果物
ぴょんぴょんさせます。
OnTriggerEnter2D、OnTriggerExit2Dの使い方
トリガーと他のオブジェクトが接触した時にイベントを起こす(2D)
OnTriggerEnter2D(Collider2D 名前){処理}
OnTriggerEnter2D(Collider2D 名前){処理}
トリガーと他のオブジェクトが離れた時にイベントを起こす(2D)
OnTriggerExit2D(Collider2D 名前){処理}
※判定するには接触するオブジェクトどちらかにRigidbody2Dが必要
ジャンプさせるスクリプトを少し変更し、KeycodeをSpaceにしてスペースキーでジャンプするようにしておきます。速度とかも少し変更。
さて現状、ジャンプさせると押し続ける限りどこまでも行ってしまうので、
コライダーをもいっこ作って位置とサイズを調節し、
足元にこんな感じで当たり判定が来るようにします。
このコライダーは「触れている」ことを判定したい = 普通のコライダーのように他のものを弾きたくないので、トリガーにする(OnTrigger)をONにしておきます。
OnTriggerがONになったコライダーは、他のコライダーと衝突しなくなります。
OnTriggerがONになったコライダーは、他のコライダーと衝突しなくなります。
トリガーを作った上で、トリガーに他のコライダーが侵入したことを検知するにはOnTriggerEnter2D、トリガーが他のコライダーから離れたことを検知するにはOnTriggerExit2Dメソッドを使用して、それぞれbool値の変数をtrueまたはfalseにしています。()の中にはCollider2D 何か名前を入力します。名前はとりあえずなんでもいいですし、EnterとExitで別でもいいです。
変数がtrue = トリガーと他のオブジェクトのコライダーが接している = 地面に着地している場合を条件に加え、条件を満たす場合のみジャンプを許可します。
あとはオブジェクト自身の重さ、重力地、ジャンプ力、当たり判定のサイズなどを調節していきます。
まだだいぶ不自然な感じですが、とりあえず目的は達成できてる時点のコードが下記。
まだだいぶ不自然な感じですが、とりあえず目的は達成できてる時点のコードが下記。
//Unity C#
//設置してるかどうか
public bool foot;
void FixedUpdate()
{
//初期化
this.GetComponent().velocity = new Vector2(0, 0);
//左
if (Input.GetKey(KeyCode.LeftArrow))
{
this.GetComponent<Rigidbody2D>().velocity = new Vector2(-20, 0);
}
//右
if (Input.GetKey(KeyCode.RightArrow))
{
this.GetComponent<Rigidbody2D>().velocity = new Vector2(20, 0);
}
//上(&&で複数条件)
if (Input.GetKey(KeyCode.Space) && foot)
{
this.GetComponent<Rigidbody2D>().AddForce(new Vector2(0, 2.5f), ForceMode2D.Impulse);
}
//下
if (Input.GetKey(KeyCode.DownArrow))
{
this.GetComponent<Rigidbody2D>().velocity = new Vector2(0, -20);
}
}
//トリガーと他のオブジェクトが接触
void OnTriggerEnter2D(Collider2D t)
{
foot = true;
}
//トリガーと他のオブジェクトが離れた
void OnTriggerExit2D(Collider2D t)
{
foot = false;
}
↑からさらに待機処理仕込んだりして色々試行錯誤し、一回完成としたのがこちらです。
オブジェクトの質量1、重力スケール80にしてます。
Curve Animationという機能も便利そうなんですが、一回実装は先送りにしました。
オブジェクトの質量1、重力スケール80にしてます。
Curve Animationという機能も便利そうなんですが、一回実装は先送りにしました。
//Unity C#
(略)
//上
if (Input.GetKey(KeyCode.Space) && foot)
{
StartCoroutine("JumpAnimation");
}
(略)
void OnTriggerExit2D(Collider2D tt)
{
//トリガーから離れた時点ではfootフラグをOFFにしない
}
IEnumerator JumpAnimation()
{
int i = 0;
//6回繰り返し
while(i < 6)
{
this.GetComponent<Rigidbody2D>().AddForce(new Vector2(0, 60), ForceMode2D.Impulse);
//少し時間を置く
yield return new WaitForSeconds(0.05f);
i++;
}
//ループが終わったらフラグをOFFにする
foot = false;
//少し下に加速
this.GetComponent<Rigidbody2D>().AddForce(new Vector2(0, -100), ForceMode2D.Impulse);
}
完成品はこちら。
やりたいことから逆引きするUNITYの使い方まとめ
Unityをやりたいことから学習していけるよう、機能・用途別にまとめたページです。C#の命令別の逆引きは現時点で作っていません。2019の時期に書き始めているので、それより前のバージョンについては言及しません。
コメント