トリガーを判定に使ってフラグを管理し、フラグがTrueの時だけなんかする、という処理の実装です。
ここでは「接地してる間はジャンプできる」という処理を実装します。
成果物
![j2](https://sunagitsune.com/wp-content/uploads/2021/08/j2.gif)
ぴょんぴょんさせます。
OnTriggerEnter2D、OnTriggerExit2Dの使い方
トリガーと他のオブジェクトが接触した時にイベントを起こす(2D)
OnTriggerEnter2D(Collider2D 名前){処理}
OnTriggerEnter2D(Collider2D 名前){処理}
トリガーと他のオブジェクトが離れた時にイベントを起こす(2D)
OnTriggerExit2D(Collider2D 名前){処理}
※判定するには接触するオブジェクトどちらかにRigidbody2Dが必要
![jp1](https://sunagitsune.com/wp-content/uploads/2021/08/jp1.png)
ジャンプさせるスクリプトを少し変更し、KeycodeをSpaceにしてスペースキーでジャンプするようにしておきます。速度とかも少し変更。
![j1](https://sunagitsune.com/wp-content/uploads/2021/08/j1.gif)
さて現状、ジャンプさせると押し続ける限りどこまでも行ってしまうので、
![jp2](https://sunagitsune.com/wp-content/uploads/2021/08/jp2.png)
コライダーをもいっこ作って位置とサイズを調節し、
![jp3](https://sunagitsune.com/wp-content/uploads/2021/08/jp3.png)
足元にこんな感じで当たり判定が来るようにします。
![jp4](https://sunagitsune.com/wp-content/uploads/2021/08/jp4.png)
このコライダーは「触れている」ことを判定したい = 普通のコライダーのように他のものを弾きたくないので、トリガーにする(OnTrigger)をONにしておきます。
OnTriggerがONになったコライダーは、他のコライダーと衝突しなくなります。
OnTriggerがONになったコライダーは、他のコライダーと衝突しなくなります。
![jp5](https://sunagitsune.com/wp-content/uploads/2021/08/jp5.png)
トリガーを作った上で、トリガーに他のコライダーが侵入したことを検知するにはOnTriggerEnter2D、トリガーが他のコライダーから離れたことを検知するにはOnTriggerExit2Dメソッドを使用して、それぞれbool値の変数をtrueまたはfalseにしています。()の中にはCollider2D 何か名前を入力します。名前はとりあえずなんでもいいですし、EnterとExitで別でもいいです。
![jp7](https://sunagitsune.com/wp-content/uploads/2021/08/jp7.png)
変数がtrue = トリガーと他のオブジェクトのコライダーが接している = 地面に着地している場合を条件に加え、条件を満たす場合のみジャンプを許可します。
![j2](https://sunagitsune.com/wp-content/uploads/2021/08/j2.gif)
あとはオブジェクト自身の重さ、重力地、ジャンプ力、当たり判定のサイズなどを調節していきます。
まだだいぶ不自然な感じですが、とりあえず目的は達成できてる時点のコードが下記。
まだだいぶ不自然な感じですが、とりあえず目的は達成できてる時点のコードが下記。
//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;
}
![an3](https://sunagitsune.com/wp-content/uploads/2021/09/an3.gif)
↑からさらに待機処理仕込んだりして色々試行錯誤し、一回完成としたのがこちらです。
オブジェクトの質量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);
}
完成品はこちら。
![](https://sunagitsune.com/wp-content/uploads/2021/07/computer-1343393_1280-160x90.jpg)
やりたいことから逆引きするUNITYの使い方まとめ
Unityをやりたいことから学習していけるよう、機能・用途別にまとめたページです。C#の命令別の逆引きは現時点で作っていません。2019の時期に書き始めているので、それより前のバージョンについては言及しません。
コメント