おはようございます!
1月28日 火曜日。晴れ🌞
予想気温14/5℃。あっっったかくはない。寒い。。
さあ、いよいよマリオを作っていきますよ!
今日の教材はこちら、
[PR]
CHAPTER 8 重力を使うゲーム
CHAPTER 8.1 重力は、ずっと下向きにかかる力
🐶 もも🍑無限出力
・新しいシーン(chap8)作成
・床を作る
・Sprite Renderer描画モードを「Tiled」にして伸ばす
・「Box Collider 2D」をアタッチし「自動タイリング」にチェック
・一旦、シーンにももをドラッグ&ドロップ
・「Box Collider 2D」「Rigidbody 2D」をアタッチ
・アタッチしたももをAssets配下にドラッグ&ドロップしてプレハブを作成

・ヒエラルキーウィンドウのももを削除
・ヒエラルキーウィンドウの[Main Camera]を選択
・「On Mouse Down Create Prefab」をアタッチ
・「New Prefab」に作成したもものプレハブを設定

・「Play」ボタンで実行

おおー!ももがいっぱい!!

ももーー!!
CHAPTER 8.2 「左右キーで移動、スペースキーでジャンプ」
🐶 スーパーマリオっぽいものを作る
・右向きの女の子の画像をシーンに配置
・「Rigidbody 2D」「Capsule Collider 2D」をアタッチ
・ツールパネルの「コライダージオメトリを編集」ボタンより体の範囲を設定
※その際、グリッドがオンになってるとうまく調整できないのでオフにすること

・さらに「On Key Press Move Gravity」をアタッチ
・床を複製し、宙に浮かせて足場を作る
・3つ目の足場に宝箱を配置し、宝箱をタッチするとクリアにする
・「Play」ボタンで実行

🐶 スクリプト
<「左右キーで移動、スペースキーでジャンプする(On Key Press Move Gravity)」抜粋>
・ジャンプするキーをプルダウンで選択
public InputKey jumpKey = InputKey.Jump;
Jump:スペースキー
Fire1:左Ctrlキー
Fire2:左Altキー
Fire3:左Shiftキー
Submit:スペースキーorEnterキー
※👆これらがどこで設定されているのかはわかりません。。。そういうもんなんでしょうな。
・横方向の移動量
vx = 0;
vx = Input.GetAxisRaw(“Horizontal”) * speed; //移動量を計算
if (vx != 0)
{
leftFlag = vx < 0; //値がマイナスならフラグを立てる
}
rbody.linearVelocity = new Vector2(vx, rbody.linearVelocity.y); //移動
GetComponent<SpriteRenderer>().flipX = leftFlag; //フラグがTrueなら左右反転
・「地面に接しているか」を調べる
isGrounded = Physics2D.Raycast(startRay, Vector2.down, checkDistance);
・ジャンプ処理
if (Input.GetButtonDown(jumpKey.ToString()) && isGrounded && !isJumping)
//(ジャンプキーが押され & 地面に接していて & ジャンプ中じゃない)場合
{
isJumping = true;
rbody.AddForce(new Vector2(0, jumppower), ForceMode2D.Impulse);
}
※「rbody.AddForce」で上向きの力を加えている
CHAPTER 8.3 動く床、乗って動く床、すり抜ける床
🐶 動く床
・2つ目の床にコンポーネントを追加
・「Rigidbody 2D」「Ping Pong Move V」をアタッチ
・「Play」ボタンで実行

🐶 スクリプト(動く床)
<「行ったり来たり移動する(垂直)(Ping Pong Move V)」抜粋>
・Kinematicモード
void Start ()
{
// 重力や外力の影響を受けずにスクリプトで移動
rbody = GetComponent<Rigidbody2D>();
rbody.bodyType = RigidbodyType2D.Kinematic;
}
※「Kinematicモード」:自分は重力・外力の影響を受けずに動くけど、他の物体には物理的に押しのける
・一定時間で上下に往復移動
void Update()
{
timer += Time.deltaTime; //経過時間
if (timer >= moveTime) //moveTime(定数)を超えたら
{
speed = -speed; // 方向転換
timer = 0.0f; //timer初期化
}
transform.Translate(Vector2.up * speed * Time.deltaTime); //上下移動
}
🐶 乗って動く床
・[Ctrl+D]で床を追加
・「Rigidbody 2D」「Ping Pong Ridable Floor」をアタッチ
・「Play」ボタンで実行

🐶 スクリプト(乗って動く床)
<「行ったり来たり移動する(乗って動く床)(Ping Pong Ridable Floor)」抜粋>
・一定時間で左右に往復移動
void Update()
{
timer += Time.deltaTime; //経過時間
if (timer >= moveTime) //moveTime(定数)を超えたら
{
speed = -speed; // 方向転換
timer = 0.0f; //timer初期化
}
CheckRemove(); // 接触しなくなったら、一緒に移動を解除
transform.Translate(Vector2.right * speed * Time.deltaTime); //左右移動
}
・床に接触したら作動する処理
private void OnCollisionEnter2D(Collision2D other)
{
childObjects.Add(other.gameObject);
other.gameObject.transform.parent = transform;
}
OnCollisionEnter2D:床に何かが接触したら実行
childObjects.Add:「衝突したオブジェクト」を「床のオブジェクト」の子オブジェクトとして追加
other.gameObject:衝突したオブジェクトが入っている
・親子関係を解除
private void CheckRemove()
{
・・・
}
CheckRemove:もし床から離れていたら親子関係を解除し自由に動くようにする
🐶 上にすり抜ける壁
・すり抜けさせたい床にコンポーネントを追加
・「Platform Effector 2D」をアタッチ
・「Box Collider 2D」の「Used By Effector」にチェックを入れる

・「Play」ボタンで実行

🐶 水の塊
・水の画像を配置
・Transformの「Z」の値を「3」
・「Box Collider 2D」「Buoyancy Effector 2D」をアタッチ
・インスペクターウィンドウの「Box Collider 2D」にて以下をチェック
□ トリガーにする(Is Trigger)
□ エフェクターで使用(Used By Effector)
□ 自動タイリング(Auto Tiling)
・水面を調整
・一旦、Sprite Rendererのチェックをオフ
・「Buoyancy Effector 2D」の密度(Density)を「5」に変更
・Surface Levelの文字の箇所を左右にドラッグし水面を調整

・最後にSprite Rendererのチェックをオンに戻す
・「Play」ボタンで実行

CHAPTER 8.4 広いステージを走り回る
🐶 広いステージを作る

・晴れの背景を配置
・Transformの「Z」の値を「10」に変更
🐶 追いかけるカメラをアタッチ
・Main Cameraに「Camera Manager」をアタッチ
・「Player」プロパティに操作キャラを設定
・ヒエラルキーウィンドウにて、背景画像を「Main Camera」にドラッグ&ドロップ

→晴れの背景(bg_sunny_0)をMain Cameraの子オブジェクトにする
・「Camera Manager」の「Follow H Only」のチェックをオフ
・「Play」ボタンで実行

🐶 スクリプト
<「カメラが動くものを追いかける(Camera Manager)」抜粋>
・LateUpdate関数
→すべてのUpdate関数が呼ばれたあとに実行される
void LateUpdate() {
・・・
}
・スタート地点より左にスクロールしない処理
if (vx < xlimit) vx = xlimit;
CHAPTER8はボリュームそこそこ大きめ・・・
疲れました。。

つかれーた
明日もあるので、終わります。。
おつかれさまでした~(´Д⊂ヽ