2025年3月23日日曜日

【Unity2D】バブルホースのシャボン玉を再現【Hunter×Hunter】

Unityの練習として、Hunter×Hunterのバブルホースのシャボン玉をUnity2Dで再現してみました。
このギミックはゲームに利用できそうです。

仕様

・Layer Collision Materialを利用して、レイヤー同士の衝突の有効・無効を設定する
・赤い丸い弾、灰色の四角い弾、赤いバリア、灰色のバリア、4つのレイヤーを作成し、オブジェクトをそれぞれのレイヤー上に生成する
・赤い丸い弾レイヤーと赤いバリアレイヤーの衝突を有効化、灰色の四角い弾レイヤーと灰色のバリアレイヤーの衝突を有効化する
・ボタン押下で赤と灰色のバリヤーを切り替える
・弾はキャラクターの周囲にランダムに生成し、キャラクターの方向に向かうように力を与える

Layer Collision Material設定

【Unity2D】スコーピオンピンボールを再現【ワールドトリガー】

Unityの練習として、ワートリのスコーピオンピンボールをUnity2Dで再現してみました。

仕様

・球を壁に当て続けて反射させ続ける
・壁はターゲットの円周上、かつ球の進行方向に生成する
 (球の進行方向と円周の交点)
・壁は球が当たったら消去されて、次の壁が生成される
・球が逸脱した方向に反射しないように壁の角度を調整する
 (球がターゲットの周囲を反射し続けるように)
・球がターゲットに当たったらHitエフェクトを表示する

【Unity 2D】Regidbody2D リファレンス

Unityで物理演算、物理シミュレーション機能を提供するクラス「Regidbody2D」の解説とリファレンスです。

リファレンス

スクリプト上で使用するプロパティ

プロパティ名説明
velocityVector2オブジェクトの現在の速度

メソッド

void AddForce( Vector2, ForceMode2D = ForceMode2D.Force )
オブジェクトに力を与える関数。力を与えて物理的な動きをさせたいときに利用する。
戻り値void
引数Vector2与える力の大きさと方向
ForceMode2D力の与え方。Force or Impulse。
Force: 継続的な力を与える場合に利用する。FixedUpdate内で利用する。
Impulse: 一度に力を与えるときに利用する、ボタンを押してジャンプ、発射するなど。

ForceMode2D 補足

ForceMode2D.Force

// ForceMode2D.Force の場合は、FixedUpdate内で利用
// 継続的な力を加え、徐々に速度を変化させる
// 力をかけ続けただけオブジェクトも加速していく
void FixedUpdate()
{
    float move = Input.GetAxis("Horizontal"); // 左右の矢印キー押下時に値を得られる
    rb.AddForce(Vector3.forward * move * 10f, ForceMode.Force); // 継続的な力を与える
}

ForceMode2D.Impulse

// ForceMode2D.Impulse の場合は、一度に力を与える
// ジャンプ、発射など、その瞬間で速度を変化させたいときに利用
void Update()
{
    // スペースキー押下時だけオブジェクトに力を与える
    if (Input.GetKeyDown(KeyCode.Space)) 
    {
        rb.AddForce(Vector3.up * 5f, ForceMode.Impulse);
    }
}

インスペクター上に表示されるプロパティ

Regidbody2DのInspector上のプロパティ

プロパティ名説明
Body TypeRigidbodyType2DDynamic, Kinematic, Static
MaterialPhysics Material 2D摩擦係数を設定できる
(Collider2D側で設定すると無視される)
Simulatedbool物理演算の適応、非適応
Massfloat質量
Auto Massboolオブジェクトのサイズから自動で質量を計算する
Linear Dragfloat空気抵抗(直線移動の減速)
Linear Dragfloatオブジェクトが回転する時の抵抗(回転の減速)
Gravity Scalefloat重力
Collision Detection選択すり抜けをするかしないかの選択
(ものすごい速さでオブジェクトに向かった時など)
Discrete: すり抜ける, Continuous: すり抜け防止
Constraintsfloat制約をかけられる。x,yの位置制約や、zの回転の制約。
制約をかけたところは動かなくなる。

参考リンク

こちらの記事に利用例を載せていますのでご参考ください。
Regidbody2D と Joystick Pack を利用してキャラを飛行させる

2025年3月22日土曜日

Regidbody2D と Joystick Pack を利用してキャラを飛行させる【Unity 2D】

Regidbody2D と Joystick Pack を利用してキャラクターを動かす方法を紹介します。

利用例: スターリーキャプター

スターリーキャプターのゲーム画面、魔女が夜空を飛行しています

スターリーキャプターはiOSアプリにて好評配信中です!
Apple Store のページ

Unityのアセット「Joystick Pack」で提供されているバーチャルパッドを操作すると、魔女が上下左右に自由に移動し空を飛んでいるようになります。

この実装にあたってのポイントを3つ挙げます

3つのポイント

1. 重力をゼロにする → Regidbody2DのGravity Scale
2. 力を与える → Regidbody2D の AddForce + Joystick Pack の出力値
3. 空気抵抗を設定する → Regidbody2DのLinear Drag

Regidbody2DのInspector上のプロパティ

1. 重力をゼロにする

Regidbody2Dの「Gravity Scale」プロパティは重力の値で、デフォルトの1だとオブジェクトは下に移動しますが、これを0にするとその場にとどまります。重力は下方向の力で、下方向の力が加わるとオブジェクトは下に動きますが、それを0にしたので動かなくなるという仕組みです。

2. 力を与える

力を与える方法はRegidbody2Dの「AddForce」関数を利用します。Update関数にて、バーチャルパッドを操作している間だけオブジェクトに力を与えることにします。

Joystick Packの説明は 「Joystick Pack リファレンスと利用例」 をご確認ください。

3. 空気抵抗を設定する

オブジェクトは抵抗がないと減衰せずにずっと動き続けてしまいます。抵抗を設定する必要がありますが、Regidbody2Dでは空気抵抗を設定できます。

空気抵抗は「Linear Drag」プロパティで、デフォルトはゼロで抵抗がない状態、ここの数値をオブジェクトの速度の減衰具合をみながら調整します。スターリーキャプターでは0.9としています。

ソースコード例

public class Majo : MonoBehaviour
{
    // Inspector に Joystick を登録できるようにする
    [SerializeField] Joystick joystick;
    
    // 物理演算を利用してオブジェクトを動かす
    private Rigidbody2D rigidBody2D;
    
    void Start()
    {
        rigidBody2D = GetComponent<Rigidbody2D>();
    }

    // FixedUpdate: Unityの物理演算独自の更新タイミング(0.02秒間隔 = 50FPS)
    void FixedUpdate()
    {
        // スティックの横方向の傾きの値を格納 -1f〜1fの範囲
        float directionX = joystick.Horizontal;

        // スティックの盾方向の傾きの値を格納 -1f〜1fの範囲
        float directionY = joystick.Vertical;

        // 物理演算を利用してオブジェクトを動かす
        var forceDirection = new Vector2( directionX, directionY );
        float force = 10f;
        rigidBody2D.AddForce( forceDirection * force );
    }
}

2025年3月19日水曜日

ゲーム用ドット絵の配色は「LOSPEC」で解決!

配色がネック

ゲームで使用するドット絵を描く際に、多くの人が悩むのが「配色」です。特に、さまざまなオブジェクトを描こうとすると、使用する色の数が増えてしまい、統一感が失われることがあります。

例えば、キャラクター、背景、小物などを個別に描いていくと、それぞれ異なる色を使ってしまいがちです。その結果、全体のデザインに一貫性がなくなり、バラバラな印象を与えてしまうことがあります。

この問題を解決する方法の一つとして、あらかじめ使用する色を決めておくことが挙げられます。最初に限定されたカラーパレットを設定し、その決められた色だけを使ってすべてのオブジェクトを描くことで、統一感のあるビジュアルに仕上げることができます。

「LOSPEC」でカラーパレットを探そう

統一感のあるカラーパレットを探す際に役立つのが「LOSPEC」というサイトです。LOSPECには、多種多様なカラーパレットが豊富に揃っており、実際にそのパレットを使用したドット絵の作例も見ることができます。

LOSPEC

作例のドット絵を参考にしながら、自分が作りたいゲームの雰囲気に合ったものを探し、そのカラーパレットを活用するのがおすすめです。これにより、配色に迷うことなく、統一感のあるドット絵を効率的に制作できるようになります。

↑ このようにカラーパレットとそれを使ったドット絵の作例が一覧表示されています

作例

上記パレットの一例にある「SWEETIE 16」のパレットでゲーム用ドット絵を描いてみました。

筆者はドット絵初心者ですが、ゲームで使用するオブジェクトのトーンを崩さずに作成ができていると思います。

ちなみにドット絵作成ツールは「Pixel Studio」を利用しています。詳しくは「Macでのゲーム用ドット絵制作環境」の記事をお読みください。

【おすすめ】Macでのゲーム用ドット絵制作環境【アプリと配色】

Unityでゲーム制作を始めた当初は、フリーの素材を利用していました。しかし、ゲーム開発に慣れてくるにつれて、自分でオリジナルの素材を用意したいと考えるようになり、ドット絵を描くようになりました。

本記事では、Mac環境でドット絵を描く際に使用しているアプリや、配色の参考にしているサイトを紹介します。これからドット絵制作に挑戦したい方や、Macで使えるアプリを探している方の参考になれば幸いです。

無料のドット絵アプリ「Pixel Studio」

App Storeに配信されているので、無料だけど安心して入手できます。
機能も充実していて、ドット絵を描くための機能がすべて入っている印象で、実際にドット絵を描いてみて困らないですし快適です。
少なくとも初級者にとっては十分すぎるアプリとなっています。

配色参考サイト「LOSPEC」

統一感のあるカラーパレットを探す際に役立つのが「LOSPEC」というサイトです。
LOSPECには、多種多様なカラーパレットが豊富に揃っており、実際にそのパレットを使用したドット絵の作例も見ることができます。

詳しくはこちらの記事に書いています。
ゲーム用ドット絵の配色は「LOSPEC」で解決!

↑ このようにカラーパレットとそれを使ったドット絵の作例が一覧表示されています

2025年3月18日火曜日

【Unity 2D】Joystick Pack リファレンスと利用例

簡単にバーチャルパッドを設置できるアセット「Joystick Pack」のうち、画面に固定のパッドを設置する「Fixed Joystick」についての解説です。

利用例: スターリーキャプターのゲーム画面

リファレンス

スクリプト上で使用するプロパティ

プロパティ名説明
Horizontalfloatスティックの横方向の傾きの値を格納
-1f〜1fの範囲
Verticalfloatスティックの縦方向の傾きの値を格納
-1f〜1fの範囲
DirectionVector2Horizontal,Vectorの値を持つVector2型のデータ

インスペクター上に表示されるプロパティ

プロパティ名説明
Handle Rangefloatハンドルの可動域
Dead Zonefloat反応させない部分
例えば0.5とすると、スティックを半分傾けても反応しなくなる
Axis Options選択Both,Horizontal,Verticalの3択
Horizontalだと横方向にだけ移動、Verticalだと縦方向にだけ移動
Snap XboolHorizontalの値が0か1のどちらかになる
Snap YboolVerticalの値が0か1のどちらかになる

Axis Options 補足

Horizontalの場合Verticalの場合

Snap X, Snap Y 補足

スティックを傾けて0か1かしか値が出力されないので、十字キーのような使い方が想定される。

利用例

記事冒頭のアニメーションのように、Joystick Packが出力するx方向、y方向の値を利用して、オブジェクトを移動させることができます。

オブジェクトを移動させる処理自体は、別の仕組みを利用します。Rigidbody2Dが提供する物理演算を利用する方法や、transform.positionで座標位置を指定する方法があります。

ソースコード(コメントにて解説)

// Joystick 設置方法
// 1. アセットストアから「Joystick Pack」を入手
// 2. プロジェクトに「Joystick Pack」をインポート
// 3. アセットインポートで追加されたプレハブ「Fixed Joystick」をCanvasに設置

public class Majo : MonoBehaviour
{
    // Inspector に Joystick を登録できるようにする
    [SerializeField] Joystick joystick;
    
    // 物理演算を利用してオブジェクトを動かす
    private Rigidbody2D rigidBody2D;
    
    void Start()
    {
        rigidBody2D = GetComponent<Rigidbody2D>();
    }

    // FixedUpdate: Unityの物理演算独自の更新タイミング(0.02秒間隔 = 50FPS)
    void FixedUpdate()
    {
        // スティックの横方向の傾きの値を格納 -1f〜1fの範囲
        float directionX = joystick.Horizontal;

        // スティックの盾方向の傾きの値を格納 -1f〜1fの範囲
        float directionY = joystick.Vertical;

        // 物理演算を利用してオブジェクトを動かす
        var forceDirection = new Vector2( directionX, directionY );
        float force = 10f;
        rigidBody2D.AddForce( forceDirection * force );
    }
}

【注目記事】

ゲーム用ドット絵の配色は「LOSPEC」で解決!