【Unity】パズルゲームを作る~メインの仕組み作った~
ご!ピクジンです。
今日も特に変わったことはありません。
我が家の犬が1匹増えた程度です。
本日は昨日の宣言通り、パズルのメインギミックを作りました。
ゲーム概要
改めて作るゲームのルールを確認します。
背景の色を切り替えてゴールを目指すパズルアクションです。
・プレイヤーは左右移動とジャンプができる。
・白と黒、2つのブロックがある。
・背景と同色のブロックは通り抜けられる。
・背景と違う色のブロックには乗ることができる。
・ボタンを押すと背景色が変わる。白⇔黒
・背景切替時に、背景と違う色のブロックの中にいたらミス。
リトライになる。
・ゴールにぴったり重なればクリア。
プレイヤーの移動
RigidBody2Dで移動させます。
横移動はこちらのサイトを参考にしました。
関係ないんですけど、このサイトの更新が途絶えて随分経つんですよね......
大丈夫なんですかね?
挙動はこちら。
背景色切り替えと連動するギミック
このパズルの目玉である、背景色の切り替え処理をしていきます。
地面はBoxCollider2Dだけ付与した空のゲームオブジェクトにしています。
下画面で地面っぽく見える黒い部分はただの背景です。
背景を回転させれば、地面(のように見えてる部分)と空がちょうど入れ替わるというわけです。
Unityの回転周りは結構面倒くさいので、適当にDOTweenを使って処理させます。
以下コードです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class Background : MonoBehaviour
{
bool rotate_flag = false;
int color = 0;
void Update()
{
SwitchColor();
}
void SwitchColor()
{
if (rotate_flag) return;
if (!Input.GetKeyDown(KeyCode.X)) return;
rotate_flag = true;
color = color == 0 ? 1 : 0;
Vector3 newRotate = new Vector3(0, 0, 360 - 180 * color);
Sequence sequence = DOTween.Sequence()
.Append(transform.DORotate(newRotate,0.4f))
.OnComplete(() =>
{
rotate_flag = false;
})
;
sequence.Play();
}
}
背景色を変えるだけならこの程度で済みます。
次はブロックの接触判定を切り替える処理です。
スプライトを表示したまま物理演算をさせないためには、RigidBody2Dのsimulatedを利用します。
simulatedをfalseにすると、コライダーの衝突判定も行われなくなります。
各ブロックに静的なRigidBody2Dを付けておけば、重力や衝突の影響を受けることなくこの機能を使うことができます。
あとは背景色変更処理時に、ブロックのsimulatedを切り替える処理を呼び出してあげれば終わりです。
動きはこんな感じです。
その他
プレイヤーキャラにアニメーション付けたりしました。
見た目に拘らないとは言いましたが、これくらいはやっておかないとね。
その他ゴールポイントや、背景切替時にブロックに押しつぶされてミスする処理など、とりあえず上に列挙したルールは全て作りました。
(ここらへんは特に説明することないので割愛)
何かもう1押し欲しいところですが、今の所何も思いつかないのでこのままステージ少し作って終わりにしようと思います。
終わり
今までのゲームに比べて書いたコードの量がすごい少ないです。
少しは成長できてるようです。
明日か明後日には遊べるようにできるでしょう。
またこんど。