ユニティーを使用した2D無限ランアクションゲームの作り方のメモです。ゲーム制作の参考にしていただければ嬉しいです。トグルボタンをクリックすると記事が表示されます。小さくて見ずらい画像はクリックで拡大できます。
作成環境
Unityバージョン2021.3.8f1で作成しました。
新しく2Dプロジェクト作成し画面サイズはFullHDにしました。
UnityAssetStoreの使用素材
こちらのアセットを使用して作成しました。
床の配置
2dobject→Tilemap→RectangularからTilemapを作成しました。
名前はFloorにしました。

アセットに入っているtilemapを使用して床を敷きました。

inspector画面から新しくタグ&レイヤー【Floor】作成して設定しました。
タグまたはレイヤーのところをクリックしてaddTag,addLayerから作成できます。

Floorにアタッチするコンポーネント
作成した床に当たり判定を付けていきます。
Tilemap Collider 2D | used by compositeにチェックを入れる。 |
Composite Collider 2D | TilemapColliderのつなぎ目を消すのに必要。 自動的にrigidbody2Dが追加される |
Rigidbody 2D | GravityScaleを0にする。Bodytypeをkinematicにする |
Playerの配置
アセットのRunフォルダから画像を配置しました。

すでに走るアニメーションが作成されているのでこれを使用しました。

inspector画面から新しくタグとレイヤー【Player】を作成して設定しました。

プレイヤーにアタッチするコンポーネント
Animator | アセットのアニメーターコントローラー player-run-1をアタッチする |
Circlecolider2D | プレイヤーに当たり判定を付ける。 istriggerにチェックを入れる。 |
Rigidbody2D | Constrainsのタブを開いて FreezerotationZにチェックを入れる。 |
どちらもjumpフォルダの画像一枚を追加しただけです。


新しくC#スクリプトを作成しました。名前はPlayerMoveにしました。
作成したスクリプトをプレイヤーにアタッチしました。
自動的に前に進んでいき、プレイヤーが地面についている時にだけジャンプできるようにしました。
プレイヤーが走るようになるスクリプトです。
スペースキーでジャンプすることができます。
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
//動く速度とジャンプ力
[SerializeField]
private float moveSpeed = 5f, jumpForce = 5f;
//rigidbody
private Rigidbody2D rb;
//地面についているかの判定
bool isJumping;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
Jump();
}
private void FixedUpdate()
{
MovePlayer();
}
private void MovePlayer()
{
//プレイヤーが自動で進んでいく
rb.velocity = new Vector2(moveSpeed, rb.velocity.y);
}
private void Jump()
{
// ジャンプをするためのコード(スペースキーが押されて、ジャンプしていないとき)
if (Input.GetKeyDown(KeyCode.Space) && !isJumping)
{
isJumping = true;
// リジッドボディに力を加える(上方向にジャンプ力をかける)
rb.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse);
}
}
private void OnCollisionEnter2D(Collision2D collision)
{
//プレイヤーが地面に接触している時
if (collision.gameObject.CompareTag("Floor"))
{
isJumping = false;
}
}
}
コードからプレイヤーがジャンプした時にアニメーションを再生するようにしました。
Animatorを開いて右クリックしてMaketrangitionで矢印を付けていきます。

paraetersの+をクリックしてFloatのパラメーター【Jump】boolのパラメーターRunを作成しました。

矢印を選択して項目を設定しました。
Run→Jump | hasexitTimeのチェックを外します。trunsitionsDuraratiorを0にする。ConditionsをJump,Greater,0.8(プレイヤーのYの位置が0の場合)に設定しました。 |
Run→Fall | hasexitTimeのチェックを外します。trunsitionsDuraratiorを0にする。ConditionsをJump,Less,0.8(プレイヤーのYの位置が0の場合)に設定しました。 |
新しくC#スクリプトを作成しました。名前はPlayerAnimationsにしました。
作成したスクリプトをプレイヤーにアタッチしました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerAnimation : MonoBehaviour
{
private Animator animator;
private void Awake()
{
animator= GetComponent<Animator>();
}
public void PlayJump(float velY)
{
animator.SetFloat("Jump", velY);
}
public void Running(bool running)
{
animator.SetBool("Run", running);
}
}
PlayerMoveを開いてコードを追加しました。
private PlayerAnimation playerAnimation;
private void Awake()
{
playerAnimation = GetComponent<PlayerAnimation>();
}
private void FixedUpdate()
{
AnimatePlayer();
}
private void AnimatePlayer()
{
playerAnimation.PlayJump(rb.velocity.y);
playerAnimation.Running(!isJumping);
}
これでジャンプした時にアニメーションのが再生されるようになりました。