前置き
子供からの夢で「牧場物語やルーンファクトリーみたいな牧場ゲームを作ってみたい!」と思っていました。
QiitaでUnityを使った2Dゲームはないかと調べたところ、素晴らしい記事を発見しました。
こちらの神記事を参考に2D牧場ゲームを作成していこうと思います。
今回作成するもの
- 1.キャラのドット絵
- 2.画像の読み込み、分割
- 3.キャラの歩行アニメーション
- 4.スクリプトの作成
1.キャラのドット絵を作成
-
EDGEでドット絵を作成
-
ゲームの主人公をルーンファクトリー4の女主人公に設定。
ルーンファクトリー4は神ゲームなのでプレイしましょう -
ドット絵制作に慣れてきたら、オリジナルの主人公描く予定。
2.画像の読み込み、分割
2-1.画像の読み込み
-
登録した画像を選択すると右側にinspectorタブが表示されます。
-
下の画像のように、6つの箇所の初期値を変更します。
設定値 | 説明 | |
---|---|---|
Texture Type | Sprite (2D and UI) | 2Dゲームでスプライト(2Dグラフィックオブジェクト)としてテクスチャを使用する場合に選択します。 |
Sprite Mode | Multiple | 画像に複数の要素がある場合に選択する必要がある。 |
Pixels Per Unit | 1 | デフォルトでは100。1ユニットの幅に対して100pixel詰め込むという意味になります。今回は1ユニットに1pixel詰め込むため1に設定する。 |
Mesh Type | Full Rect | スプライトをマッピングするクアッドが生成されます。 |
Filter Mode | Pointer (no filter) | ピクセルを1つ1つブロックのように表示する |
Compression | None | テクスチャを圧縮しません。 |
2-2.画像の分割
-
Sprite Editor
をクリックします。
- Typeを
Grid By Cell Count
、C:3
、R:4
と変更をします。(横を3,縦に4に分けるため)
- Applyボタンを押すと完了。Asset内の画像の右矢印を押すと、分割した状態が見れます。
3.キャラの歩行アニメーション
3-1.AnimationClipファイルの作成
- 画面を分割したので、歩行アニメーションを作成していきます。
- 先ほど作成した画像ファイルを左のhierarchyタブにドラッグ&ドロップします。
- 追加しらオブジェクトを選択した状態で
Windows > Animation > Animation
を指定します。
- 別ウィンドウに
To begin animationg Grid,…
のメッセージが表示されます、Create
ボータンを押すとAnimationファイルが新規作成されます。 - 左上にファイル名が表示され、
Add Property
ボタンを押しSprite Renderer -> Sprite
を選択します。
- プロパティが追加されたらファイル名の横に表示されている
Samples
を4にしましょう。 - Samplesが表示されない場合は、右上の
:
を押し、Show Sample Rate
をクリックしましょう。
- 以下の通りのアニメーションを繰り返して設定します。
右足前 > 静止 > 左足前 > 静止
- ▶ボタンを押すことで動きを確認できます。
- 今は前に進む
char_cro_down
を作成しました。 -
Create New Clip
を押して別方向のアニメーションを作成していきましょう。- char_cro_down:下方向
- char_cro_left:左方向
- char_cro_right:右方向
- char_cro_up:上方向
- 名前は自由ですが、downやupと名前を付けたほうがわかりやすいです。
3-2.AnimatorColtollerの作成
-
次に「上移動のときに上に移動するアニメーションを再生する」というコントロール、AnimatorControllerを作成していきます。
-
BlenderTree
を使って、アニメーションを表示する制御をしてくれるものを使います。 -
アニメーションファイルと一緒に作成された下のファイルをダブルクリックします。
- とりあえず、
右クリック > Create State > From New Blend Tree
を選択し、作成されたBlendTree
を右クリックしてSet as Layer Default State
を選択します。 - そうすると、
Entry
から生えている線が作ったブロックに向きます。
3-3.Parameterの設定
3-4.BlenderTreeの設定
- 上で作った
BlenderTree
をダブルクリックすると、下の画像のような何も設定されていない状態のBlenderTree
が表示されます。
-
BlendType
を1D
から2D Simple Directional
を選択します。
-
Parameters
をBlend
からx
に変えましょう。y
でも同じ作業をしましょう。
-
+
ボタンを押し、Add Motion Field
を押しましょう。
-
Motion
の左下の+
を押すと、新しいMotionを追加できます。 - 上下4方向のMotionを作成するため、3回ほどクリックしましょう。
- 下の画像のようになればOK。
- これで
AnimatorColtroler
の設定が完了です。
4.スクリプトの作成
4-1.RididBody2Dをセットする
- 先ほど作成したオブジェクトをクリックし、右の
Inspector
を表示します。 -
Add Component
をクリックし、RigidBody2D
を選択しましょう。
-
RididBody2D
という枠が表示されます。 -
Body Type
をKinematic
にすることで、物理演算が無視され2Dっぽい動きになります。
4-2.スクリプトの作成
- 右クリックから
Create > C# Script
を選択してファイルを作成します。 - できれば
Asset > Scripts
というフォルダを作成して、そこでファイルを作ったほうがわかりやすいです。
-
#
をいうアイコンのファイルがされます。 -
MoveController.cs
の名前を付けましょう。
- キー操作でオブジェクトを動かすスクリプトを作成。とむおさんのコードをそのままコピペしてます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/**
* キャラの座標を変更するController
*/
public class MoveController : MonoBehaviour {
[SerializeField]
float SPEED = 1.0f;
private Rigidbody2D rigidBody;
private Vector2 inputAxis;
void Start() {
// オブジェクトに設定しているRigidbody2Dの参照を取得する
this.rigidBody = GetComponent<Rigidbody2D>();
}
void Update() {
// x,yの入力値を得る
// それぞれ+や-の値と入力の関連付けはInput Managerで設定されている
inputAxis.x = Input.GetAxis("Horizontal");
inputAxis.y = Input.GetAxis("Vertical");
}
private void FixedUpdate() {
// 速度を代入する
rigidBody.velocity = inputAxis.normalized * SPEED;
}
}
- 次はキー操作にあわせてアニメーションに状態をわたすスクリプトを作成
- 名前は
AnimationStateController.cs
に設定。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/**
* キャラの向き状態を変更するController
*/
public class AnimationStateController : MonoBehaviour {
Animator animator;
void Start() {
// 初期化
// コントローラをセットしたオブジェクトに紐付いている
// Animatorを取得する
this.animator = GetComponent<Animator>();
}
/**
* Update は MonoBehaviour が有効の場合に、毎フレーム呼び出されます
* https://docs.unity3d.com/ja/current/ScriptReference/MonoBehaviour.Update.html
*/
void Update() {
if (Input.anyKeyDown) {
Vector2? action = this.actionKeyDown();
if (action.HasValue) {
// キー入力があればAnimatorにstateをセットする
setStateToAnimator(vector: action.Value);
return;
}
}
// 入力からVector2インスタンスを作成
Vector2 vector = new Vector2(
(int)Input.GetAxis("Horizontal"),
(int)Input.GetAxis("Vertical"));
// キー入力が続いている場合は、入力から作成したVector2を渡す
// キー入力がなければ null
setStateToAnimator(vector: vector != Vector2.zero? vector : (Vector2?)null);
}
/**
* Animatorに状態をセットする
*
*/
private void setStateToAnimator(Vector2? vector) {
if (!vector.HasValue) {
this.animator.speed = 0.0f;
return;
}
Debug.Log(vector.Value);
this.animator.speed = 1.0f;
this.animator.SetFloat("x", vector.Value.x);
this.animator.SetFloat("y", vector.Value.y);
}
/**
* 特定のキーの入力があればキーにあわせたVector2インスタンスを返す
* なければnullを返す
*/
private Vector2? actionKeyDown() {
if (Input.GetKeyDown(KeyCode.UpArrow)) return Vector2.up;
if (Input.GetKeyDown(KeyCode.LeftArrow)) return Vector2.left;
if (Input.GetKeyDown(KeyCode.DownArrow)) return Vector2.down;
if (Input.GetKeyDown(KeyCode.RightArrow)) return Vector2.right;
return null;
}
}
完成
次回作成するもの(仮)
- マップの作成