いままでtransformでキャラを強制的に動かしてきましたが今回から物理エンジンで動かすことにします。もうそろそろなにかゲーム的なものを作らないといけないですね(´・ω・`)。
Rigidbody2Dで動かす
移動にはvelocityプロパティ、ジャンプにはAddForceメソッドを使います、コードはこんな感じになりました。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player1 : MonoBehaviour { Rigidbody2D rbody ; float vx = 0; float vy = 0; public float speed = 2; public float jumppower = 6; bool leftFlag = false; bool jumpFlag = false; bool pushFlag = false; bool groundFlag = false; // Start is called before the first frame update void Start() { rbody = GetComponent<Rigidbody2D>(); } void OnCollisionStay2D(Collision2D collision) { groundFlag = true; } private void OnCollisionExit2D(Collision2D collision) { groundFlag = false; } // Update is called once per frame void Update() { vx = 0; if (Input.GetKey("right")) { vx = speed; leftFlag = false; } if (Input.GetKey("left")) { vx = -speed; leftFlag = true; } if (Input.GetKey("space")&& groundFlag) { if (pushFlag == false) { jumpFlag = true; pushFlag = true; } } else { pushFlag = false; } rbody.velocity = new Vector2(vx, rbody.velocity.y); GetComponent<SpriteRenderer>().flipX = leftFlag; if (jumpFlag) { jumpFlag = false; rbody.AddForce(new Vector2(0, jumppower), ForceMode2D.Impulse); } } }
Rigidbody2D rbody で最初に宣言しときます、そして他にもいろいろ宣言しときます、あとジャンプのFlagとしてbool型を使います。
フラグは結構便利でいろいろなゲームに使われてますシューティング、アクション、RPG、ノベルのほぼすべてのゲームに。
void OnCollisionStay2D(Collision2D collision)・・はキャラと地面がぶつかってる最中なら地面のフラグをtrueにして。
void OnCollisionExit2D(Collision2D collision)・・はキャラと地面が離れている状態なら地面のフラグをfalseにするという感じです。
そして、if (jumpFlag)・・もしジャンプフラグがtrue状態ならジャンプしたあと、すぐにFlagをfalseにしてください、じゃないと空中でもジャンプできてしまいます。
ということで今回は物理エンジンでキャラを動かしてみました、次回はアニメーションをやりたいと思います、それが済んだらそろそろ簡単なゲームを一つ作っていきたいなーと考えています。
コメント