スーパーマリオのようにキャラクターを動かすプログラムをUnityとScratchで作りました。
Unityは物理エンジンがあるので、ジャンプや着地、地面との衝突の挙動は、ほぼ自動で組み込むことできます。
一方スクラッチは、物理エンジンがないので、物理的な挙動や衝突処理を手作りすることになり、完璧なものを作るのは結構難しいです。
今回、Scratchでこういった動かし方をどう作るかをgriffpatchさんの動画で勉強しました。
衝突時にどうやって壁や地面に埋まらないようにするか、ジャンプしたときに屋根にくっついてしまうバグをどう直すかなどのノウハウは、本当になるほど!ってなります。
Code a Platformer Game 1
Code a Platformer Game 2
そしてこれらを参考にしつつ自分でも思うように初めから作ってみたのが、こちらです。
メインのコードはこんな分量ですが、griffpatchさんのノウハウが詰まっています。
このあとUnityでも同じようなものを作ってみて違いを確かめました。
Unityでは物理演算は必要ないですが、キーコントロールやアニメーションの部分のコードが必要になります。
こちらは、「楽しく学ぶUnity2D超入門講座」を参考にして
こんな感じになりました。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class KeyController : MonoBehaviour { readonly float jumpForce = 16.0f; readonly float xSpeed = 10.0f; readonly float gravity = 5; bool groundFlag = false; Rigidbody2D rbody; Animator animator; void Start() { rbody = GetComponent<Rigidbody2D>(); rbody.gravityScale = gravity; animator = GetComponent<Animator>(); } void FixedUpdate() { // ジャンプ if (Input.GetKey(KeyCode.Space) && groundFlag){ this.GetComponent<Rigidbody2D>().AddForce(new Vector2(0, jumpForce), ForceMode2D.Impulse); } // 右の移動 if (Input.GetKey(KeyCode.F)){ rbody.velocity = new Vector3(xSpeed, rbody.velocity.y); this.GetComponent<Rigidbody2D>().velocity = rbody.velocity; this.GetComponent<SpriteRenderer>().flipX = false; } // 左の移動 if (Input.GetKey(KeyCode.S)){ rbody.velocity = new Vector3(-xSpeed, rbody.velocity.y); this.GetComponent<Rigidbody2D>().velocity = rbody.velocity; this.GetComponent<SpriteRenderer>().flipX = true; } // アニメーションの速度を実際の動きに同期 if (Mathf.Abs(rbody.velocity.x)>0.01){ animator.SetFloat("WalkSpeed", 2); }else{ animator.SetFloat("WalkSpeed", 0); } } void OnTriggerStay2D(Collider2D collision){ // 地面に足がついている groundFlag = true; } void OnTriggerExit2D(Collider2D collision){ // 地面に足がついていない groundFlag = false; } }
ある程度のコードはありますが、ノウハウは少ないのでscratchよりはだいぶ楽です。
コメントを残す