40代ゲーム制作初心者の手記

40代でゲーム制作に挑む無謀なプロジェクトです。とりあえずUnityでやってみます。

仕切り直し

ガッチガチに指定を固めないと碌な物できないみたい。

 

<わい>

Unityで次の挙動を作りたい。

GameObject
1.Cannon
2.Bullet
3.Enemy
4.Power gauge

1.Cannonを上下に擦るとPowerが上昇する。
2.Powerが上昇するとpower gaugeが視覚的に上昇する
3.powerが規定値に達すると10秒後にCannonからBulletがEnemyに向けて発射される。
4.BulletとEnemyが衝突すると爆発し、BulletとEnemyが消滅する。

位置関係はCannonが画面下部、Enemyは画面の上にいてBulletが発射されるとカメラはBulletを追いかける。

 

<chatGPAの解答>

Unity でこの動作を実装するために実行できる手順の概要を次に示します。

ゲーム オブジェクトを作成します。
を。 Cannon ゲームオブジェクトを作成し、スプライト レンダラーを追加してスプライトを表示します。
b. Bullet ゲームオブジェクトを作成し、スプライト レンダラーを追加してスプライトを表示します。
c. Enemy GameObject を作成し、スプライト レンダラーを追加してスプライトを表示します。
d. パワー ゲージ ゲームオブジェクトを作成し、UI スライダー コンポーネントを追加してゲージを表示します。

キャノンを上下にこすり、パワーを上げます:
を。 スクリプトを Cannon ゲームオブジェクトにアタッチして、パワーの増加を処理します。
b. Unity の Input クラスを使用して、マウスまたはタッチの上下の動きを検出します。
c. マウスまたはタッチが上に移動すると電力値が増加し、下に移動すると減少します。
d. パワーゲージの値を更新して、パワーの増加を視覚的に反映します。

弾丸を発射する:
を。 Cannon ゲームオブジェクトにスクリプトをアタッチして、弾丸の発射を処理します。
b. 電力が指定された値に達した後、コルーチンを使用して 10 秒間待機します。
c. Bullet ゲームオブジェクトをインスタンス化し、その位置と速度を設定して敵に向かって移動します。
d. カメラで弾丸を追跡します。

衝突検出:
を。 Bullet ゲームオブジェクトにスクリプトをアタッチして、敵との衝突を検出します。
b. Collider2D コンポーネントの OnCollisionEnter2D メソッドを使用して衝突を検出します。
c. 衝突が検出されたら、Bullet と Enemy ゲームオブジェクトの両方を破壊します。

注: 衝突を検出するために、ゲームオブジェクトにコライダーを追加する必要がある場合があります。

これは大まかな概要であり、この動作を実装するには、追加のロジックとコンポーネントを追加する必要がある場合があります。 ただし、これにより、Unity で説明した動作を作成するための出発点が得られるはずです。

 

 

という方向性でいきましょう。

 

ついでにNovelAIで作った画像

AIなんでもできて凄い

出来上がりがゴミでした。

思っていたのと違う
まずはパワーゲージを見えるようにしよう
大砲を上下に擦ってパワーを溜めて
パワーを溜めたらパワーゲージが目に見えて上がっていく。
ゲージが溜まったら10秒後に発射。
発射した弾は上方向に元気よく飛び出すようにしたい。

 

Unity でこれを実装する方法の基本的な概要は次のとおりです。

UI 画像などのパワー ゲージ ゲーム オブジェクトを作成して、充電レベルを視覚的に表示します。
大砲ゲーム オブジェクトを作成し、それにスクリプトを追加して、電力の充電と発砲を処理します。
Input.GetMouseButtonDown と Input.GetMouseButton を使用して、プレイヤーが大砲をなでるタイミングと止めるタイミングを検出します。
プレーヤーがストロークを開始したら、タイマーを開始し、充電レベルを反映するようにパワー ゲージの画像を更新します。
プレーヤーがなでるのをやめたら、タイマーが 10 秒に達したかどうかを確認します。 ある場合は、弾丸を発射します。
上向きの速度を与えるスクリプトを使用して弾丸プレハブを作成します。
弾丸が発射されたら、それをインスタンス化し、上向きの初期速度を与えます。
これは基本的な概要にすぎません。正しく機能させるには、詳細を入力し、コードを追加する必要がありますが、出発点としては適切です。

変なエラーでますよ

こんなエラーが出て怒られましたよ

 

UnassignedReferenceException: The variable bulletPrefab of CannonScript has not been assigned.
You probably need to assign the bulletPrefab variable of the CannonScript script in the inspector.
UnityEngine.Object.Internal_InstantiateSingle (UnityEngine.Object data, UnityEngine.Vector3 pos, UnityEngine.Quaternion rot) (at <a0ef933b1aa54b668801ea864e4204fe>:0)
UnityEngine.Object.Instantiate (UnityEngine.Object original, UnityEngine.Vector3 position, UnityEngine.Quaternion rotation) (at <a0ef933b1aa54b668801ea864e4204fe>:0)
UnityEngine.Object.Instantiate[T] (T original, UnityEngine.Vector3 position, UnityEngine.Quaternion rotation) (at <a0ef933b1aa54b668801ea864e4204fe>:0)
CannonScript.FireBullet () (at Assets/CannonScript.cs:58)
CannonScript.Update () (at Assets/CannonScript.cs:41)

 

発生しているエラー メッセージは「UnassignedReferenceException」であり、CannonScript スクリプトの bulletPrefab 変数が割り当てられていないことを示しています。 これは、スクリプト内の bulletPrefab 変数が有効なオブジェクトに設定されていないことを意味します。したがって、FireBullet メソッド内の Instantiate の呼び出しは、許可されていない null オブジェクトをインスタンス化しようとしています。

この問題を解決するには、Inspector で bulletPrefab 変数を割り当てる必要があります。 方法は次のとおりです。

Unity エディターで大砲ゲーム オブジェクトを選択します。
インスペクタで、「bulletPrefab」フィールドを見つけます。
フィールドの右側にある小さな円をクリックして、オブジェクト ピッカーを開きます。
前の手順で作成した弾丸プレハブを選択します。
[再生] ボタンを押してゲームを開始し、エラーが解決したかどうかをテストします。
これらの手順を実行すると、 bulletPrefab 変数が弾丸プレハブに設定され、エラー メッセージが表示されなくなります。

あとは何をすれば弾を発射できますか?

弾丸を発射するには、マウスの左ボタンを押したまま大砲を充電する必要があります。 マウスの左ボタンを離すと、10 秒以上押し続けていれば大砲が弾丸を発射します。

Unity でテストする方法は次のとおりです。

Unity エディターで大砲ゲーム オブジェクトを選択します。
インスペクターで、「bulletPrefab」フィールドが前の手順で作成したプレハブに設定されていることを確認します。
Unity エディターで、[再生] ボタンを押してゲームを開始します。
大砲を充電するには、マウスの左ボタンを押したままにします。
マウスの左ボタンを放して、弾丸を発射します。
マウスの左ボタンを 10 秒以上押し続けると、CannonScript スクリプトの charge 変数と bulletSpeed 変数によって決定されるサイズと速度で弾丸が発射されます。 発射後、マウスの左ボタンをさらに 10 秒間押し続けると、弾丸が大きくなります。

Bullet用のコードはどうすればいいでしょうか

Bullet用のコードはどうすればいいでしょうか

 

Unity で箇条書きに使用できるサンプル スクリプトを次に示します。

using UnityEngine;

public class BulletScript : MonoBehaviour
{
    public float bulletLifetime = 10.0f;

    private void Start()
    {
        Destroy(gameObject, bulletLifetime);
    }
}

このスクリプトは、Start メソッドを使用して、一定時間後に弾丸を破壊します。 bulletLifetime 変数は、弾丸が破壊されるまでの存続時間を指定します。 これは、弾丸が多すぎてゲームが乱雑になるのを防ぎ、メモリを解放するのに役立ちます。

このスクリプトを箇条書きに使用するには、次の手順に従います。

Unity で、[アセット] メニューに移動し、[作成] > [C# スクリプト] を選択します。
スクリプトに「BulletScript」という名前を付けます。
スクリプトをダブルクリックして、Visual Studio または別のコード エディターで開きます。
既存のコードを私が提供したコードに置き換えます。
スクリプトを保存して Unity に戻ります。
アセットパネルで右クリックし、「作成」>「プレハブ」を選択して弾丸プレハブを作成します。
SpriteRenderer コンポーネントを含む新しいゲーム オブジェクトをプレハブにドラッグします。
プレハブ内のゲームオブジェクトに「BulletScript」スクリプトをアタッチします。
大砲ゲーム オブジェクトに添付されたスクリプトで、行 public GameObject bulletPrefab; を置き換えます。 public GameObject bulletPrefab = null; を使用します。
FireBullet メソッドで、GameObject bullet = Instantiate(bulletPrefab, transform.position, transform.rotation); の行を置き換えます。 GameObject bullet = Instantiate(bulletPrefab, transform.position, transform.rotation) as GameObject; を使用します。
これで、弾丸を発射すると、BulletScript スクリプトで指定されているように、 bulletLifetime 秒後に自動的に破棄されます。

 

最後の方ようわからんかったからもっと詳しく

 

Unity で箇条書きに使用できるサンプル スクリプトを次に示します。

using UnityEngine;

public class BulletScript : MonoBehaviour
{
    public float bulletLifetime = 10.0f;

    private void Start()
    {
        Destroy(gameObject, bulletLifetime);
    }
}

 

ステップ 9:

Cシャープ
コードをコピー
大砲ゲームオブジェクトに添付されたスクリプトで、「public GameObject bulletPrefab;」の行を「public GameObject bulletPrefab = null;」に置き換えます。
この手順はオプションですが、Unity エディターで変数に値を割り当てるのを忘れた場合に備えて、変数を初期化することをお勧めします。 bulletPrefab 変数を null に設定することで、インスペクターでスクリプトに値を割り当てるのを忘れた場合に、スクリプトが null 参照例外をスローしないようにします。

ステップ 10:

scss
In the `FireBullet` method, replace the line `GameObject bullet = Instantiate(bulletPrefab, transform.position, transform.rotation);` with `GameObject bullet = Instantiate(bulletPrefab, transform.position, transform.rotation) as GameObject;`.

に置き換えます。
この手順もオプションですが、Instantiate の結果を正しい型に明示的にキャストすることをお勧めします。 結果を GameObject にキャストすることで、 bulletPrefab が異なるタイプのオブジェクトに設定されている場合でも、弾丸のタイプが正しいことを確認できます。 これにより、コードがより安全になり、理解しやすくなります。
このスクリプトは、Start メソッドを使用して、一定時間後に弾丸を破壊します。 bulletLifetime 変数は、弾丸が破壊されるまでの存続時間を指定します。 これは、弾丸が多すぎてゲームが乱雑になるのを防ぎ、メモリを解放するのに役立ちます。

このスクリプトを箇条書きに使用するには、次の手順に従います。

Unity で、[アセット] メニューに移動し、[作成] > [C# スクリプト] を選択します。
スクリプトに「BulletScript」という名前を付けます。
スクリプトをダブルクリックして、Visual Studio または別のコード エディターで開きます。
既存のコードを私が提供したコードに置き換えます。
スクリプトを保存して Unity に戻ります。
アセットパネルで右クリックし、「作成」>「プレハブ」を選択して弾丸プレハブを作成します。
SpriteRenderer コンポーネントを含む新しいゲーム オブジェクトをプレハブにドラッグします。
プレハブ内のゲームオブジェクトに「BulletScript」スクリプトをアタッチします。
大砲ゲーム オブジェクトに添付されたスクリプトで、行 public GameObject bulletPrefab; を置き換えます。 public GameObject bulletPrefab = null; を使用します。
FireBullet メソッドで、GameObject bullet = Instantiate(bulletPrefab, transform.position, transform.rotation); の行を置き換えます。 GameObject bullet = Instantiate(bulletPrefab, transform.position, transform.rotation) as GameObject; を使用します。
これで、弾丸を発射すると、BulletScript スクリプトで指定されているように、 bulletLifetime 秒後に自動的に破棄されます。

このコードはどうすればいいぽよ?

このコードは何に貼り付ければいいですか?

 

Unity プロジェクトのスクリプト ファイルにコードを貼り付けることができます。

方法は次のとおりです。

Unity で、[アセット] メニューに移動し、[作成] > [C# スクリプト] を選択します。
スクリプトに「CannonScript」という名前を付けます。
スクリプトをダブルクリックして、Visual Studio または別のコード エディターで開きます。
既存のコードを私が提供したコードに置き換えます。
スクリプトを保存して Unity に戻ります。
Unity エディターで大砲ゲーム オブジェクトを選択します。
インスペクターで、[コンポーネントの追加] ボタンをクリックし、[新しいスクリプト] を選択します。
作成した「CannonScript」スクリプトを選択します。
これでスクリプトが cannon ゲーム オブジェクトにアタッチされ、Unity ゲーム エンジンでフレームごとに実行されます。

大砲ゲームオブジェクトにつけるスクリプトはどうすればいいでしょうか

大砲ゲームオブジェクトにつけるスクリプトはどうすればいいでしょうか

 

Unity で大砲ゲーム オブジェクトに使用できるサンプル スクリプトを次に示します。

csharp
Copy code
using System.Collections;
using UnityEngine;

public class CannonScript : MonoBehaviour
{
    public GameObject bulletPrefab;
    public float bulletSpeed = 10.0f;
    public float bulletSize = 1.0f;
    public float maxChargeTime = 10.0f;
    public float maxBulletSizeTime = 10.0f;

    private float chargeTime = 0.0f;
    private float bulletSizeTime = 0.0f;
    private float charge = 0.0f;
    private bool isCharging = false;
    private bool isFiring = false;

    void Update()
    {
        if (isCharging)
        {
            chargeTime += Time.deltaTime;
            charge = Mathf.Clamp01(chargeTime / maxChargeTime);

            if (Input.GetMouseButtonUp(0) || chargeTime >= maxChargeTime)
            {
                isCharging = false;
                isFiring = true;
            }
        }
        else if (isFiring)
        {
            bulletSizeTime += Time.deltaTime;

            if (Input.GetMouseButton(0) && bulletSizeTime < maxBulletSizeTime)
            {
                bulletSize = Mathf.Clamp01(bulletSizeTime / maxBulletSizeTime);
            }
            else
            {
                FireBullet();
                isFiring = false;
                chargeTime = 0.0f;
                bulletSizeTime = 0.0f;
                charge = 0.0f;
                bulletSize = 1.0f;
            }
        }

        if (Input.GetMouseButtonDown(0))
        {
            isCharging = true;
        }
    }

    void FireBullet()
    {
        GameObject bullet = Instantiate(bulletPrefab, transform.position, transform.rotation);
        bullet.transform.localScale *= bulletSize;
        Rigidbody2D rb = bullet.GetComponent<Rigidbody2D>();
        rb.velocity = transform.right * bulletSpeed * charge;
    }
}

このスクリプトは、Update メソッドを使用して、弾丸の充電、発射、スケーリングを処理します。 Input.GetMouseButtonDown メソッドと Input.GetMouseButtonUp メソッドを使用して、プレイヤーが大砲をなでるタイミングと止めるタイミングを検出します。 charge 変数は充電された電力量を追跡し、 bulletSize 変数は弾丸の大きさを追跡します。 プレーヤーが充電を停止すると、スクリプトは弾丸プレハブをインスタンス化し、bulletSize 変数に基づいてそのスケールを設定し、charge 変数と bulletSpeed 変数に基づいて初期速度を与えることで、弾丸を発射します。