【Launch Condition】作り始め

3/01/2026

Game Unity

ゲーム企画(前回)を企画倒れさせないためにも、Tutorialはひとまずこなしてみた。このBlogでも途中経過を記録していきたいため、作成した内容をgifで残せるように、Recorderについても調べてみた。
    Tutorial:    2D Beginner Game: Sprite Flight

Recorderについて

準備

(Unity Hubではなく)作成したProjectにてRecorderをインストール。
Window > Package Management  > Package Manager
Unity RegistoryでRecorderを検索

Recorderを開く

インストールしたら、Windowメニュー/GeneralからRecorderのWindowを出す:
Window > General > Recorder > Recorder Window

Gifの撮影

Gifを撮るには、EncorderをGIF Encorderに変えるだけ。
その他、Target FPSやQualityなど設定項目は色々あるが、デフォルトでさほど問題なさそう
あとは、[START RECORDING]ボタンから撮影開始。このボタンはPlayボタンも兼ねているため、ゲームも開始される。
停止後にProjectフォルダー内のRecordingフォルダに保管される。
ひとまずTutorialの成果

【Launch Condition】バージョン0.1

作成を進めるに当たって一歩ずつ徐々に進めるための提案をChatGPTからもらう:
ーーー
この手の企画で一番よくある失敗は「最初から完成形を作ろうとして溺れる」こと。
Launch Condition は特に、段階を刻むほど気持ちよく育つタイプだ。
ここでは
Unityに慣れる × モチベを削らない × 企画を壊さない
この3点を同時に満たす進め方を出す。
結論から言うと最初のゴールは「地球から撃って、きれいな放物線が描ける」だけでいい。
ーーー
ひとまず最初の一歩として、ChatGPT推奨の以下のフェーズを進める:
  • フェーズ0: Unityに慣れる ⇛ ✔ Tutorialはこなしたので済
  • フェーズ1: “撃つ”だけのロケット
  • フェーズ2: 発射条件を“触れる”ようにする
※ ChatGPTはフェーズ5でリリース版としているが、会話を進めるたびに色々変化しているため、フェーズ3以降はフェーズ2終了後に計画する。

フェーズ1: “撃つ”だけのロケット

2D Projectを作成

Tutorialと同じく、Universal 2Dで新しいProjectを作成。

スプライトを配置

Hierarchyで新しいSpriteを作成:
        Create > 2D Object > Sprites > (任意の形状)

スクリプト

ひとまず初速を与えて放物線軌道を描くだけのシンプルな動作を作成。
        速度: Vector2 velocty;
        重力: Vector2 gravity = new Vector2(0f, -9.8f);
Start() 初速条件:
        velocity = new Vector2(1f, 10f);
Update() 計算毎の速度変化: 
        velocity += gravity * Time.deltaTime;
        transform.position += (Vector3)(velocity * Time.deltaTime);

フェーズ1の結果

初速(x=1、y=10)

フェーズ2: 発射条件を“触れる”ようにする

フェーズ2では、発射角度と初速を設定できるようにする。ひとまずUIの作り込みは後回しにして、Inspector内で変更できるのみ。ついでにSpriteの角度も進行方向に合わせて回るようにした。

発射角度と初速設定へ変更

発射条件
        射角:  public float launchAngleDeg = 60f;
        初速:  public float LaunchSpeed = 10f;
Start() 初速条件:
        float rad = launchAngleDeg * Mathf.Deg2Rad;
        velocity = new Vector2(Mathf.Cos(rad), Mathf.Sin(rad)) * LaunchSpeed;
Update() 計算毎の速度変化: 
        velocity += gravity * Time.deltaTime;
        transform.position += (Vector3)(velocity * Time.deltaTime);
        if (velocity.sqrMagnitude > 0.0001f)
        {
            float RocketAngle = Mathf.Atan2(velocity.y, velocity.x) * Mathf.Rad2Deg;
            transform.rotation = Quaternion.Euler(0f, 0f, RocketAngle - 90f);
        }

UI追加

TutorialでもUI作成は行ったが、手順がいくつかあり少々分かりにくかったので念の為メモ:
  Hierarchy > UI Toolkit > UI Document > [GameUIへ名前を変更]
  Asset > Create > UI Toolkit > UI Document > [UILayoutへ名前を変更]
  Game UIのSouce Assetに、作成したUILayoutをDrag & Drop
  Spriteを選択しScirptのUi Documentに、GameUIをDrag & Drop

現時点のコード

using UnityEngine;
using UnityEngine.UIElements;
using UnityEngine.SceneManagement;

public class RocketTest : MonoBehaviour
{
    public float launchAngleDeg = 60f;
    public float launchSpeed = 10f;
    Vector3 startPos;
    Vector2 velocity;
    Vector2 gravity = new Vector2(0f, -9.8f);
    Rigidbody2D rb;
    // UI
    public UIDocument uiDocument;
    private Button resetButton;

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        startPos = transform.position;
        float rad = launchAngleDeg * Mathf.Deg2Rad;
        velocity = new Vector2(Mathf.Cos(rad), Mathf.Sin(rad)) * launchSpeed;

        rb = GetComponent<Rigidbody2D>();
        // UI
        resetButton = uiDocument.rootVisualElement.Q<Button>("ResetButton");
        //resetButton.style.display = DisplayStyle.Flex;
        resetButton.clicked += ResetRocket;
    }

    // Update is called once per frame
    void Update()
    {
        velocity += gravity * Time.deltaTime;
        transform.position += (Vector3)(velocity * Time.deltaTime);
        if (velocity.sqrMagnitude > 0.0001f)
        {
            float RocketAngle = Mathf.Atan2(velocity.y, velocity.x) * Mathf.Rad2Deg;
            transform.rotation = Quaternion.Euler(0f, 0f, RocketAngle - 90f);
        }
    }
    // Reset Game
    public void ResetRocket()
    {
        rb.linearVelocity = Vector2.zero;
        rb.angularVelocity = 0f;
        transform.position = startPos;
        transform.rotation = Quaternion.identity;
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }
}

これにてひとまずフェーズ2完了。
Inspectorで初速と射角を指定して実行すると1回発射。RESETボタンで同じ条件リピート。
初速12/射角45° 


人気の投稿

ラベル

Outdoor (23) 3D Printer (13) Raspberry Pi (11) Learning (10) Ubuntu (8) Movie (7) Game (6) Pico (6) FreeCAD (5) Blog (4) MSFS (4) Python (4) Unity (3) Gadget (1)

About

思い付きで始めた様々なコトをやった感想やメモ、Web上で見つけた後々役立ちそうなコトなどをまとめてます。 万人の役に立つコンテンツではなく自分用メモ的な内容ですが、何かの役に立てば幸いです

このブログを検索

連絡フォーム

名前

メール *

メッセージ *

QooQ