メタルストライク

UNITYでつくったロボットシューティングゲームです。ロボットは最初2機で、クリアする毎に1機づつ増えていきます。町には自動車が沢山走っていますが、パトカーと救急車以外は破壊しても構いません。ゲームエンドは、自動車にぶつかった時、ロボットに接触した時、町から落下した時です。
ゲーム説明
町にいるロボットを全て破壊すれば面クリアです。クリアする毎に、ロボットが1機づつ増えていきます。ロボットの頭の上には赤くて長い棒を表示してあるので、それで見つけて下さい。
PC用:キーボードの カーソルキー「→」Numpad6[Keyboard]「←」Numpad4[Keyboard]で左右回転「↑」Numpad8[Keyboard]でダッシュ「↓」Numpad5[Keyboard]で歩行、「Control」「z」で弾を発射、「スペース」「x」でジャンプです。

スマホ用:四つの「カーソルボタン」もしくは「カーソルキー」で移動、「FIRE」ボタンもしくは「Control」で弾を発射、「ジャンプ」ボタンでジャンプです
「Safari」でプレイするときはフルスクリーン(全画面)表示にして下さい

このゲームは”WaypointProgressTracker”を使ってます。作った時にはスタートから全ての”Vehicle”を表示する方法がわからず時間差で同じ場所に”Instantiate”する事で妥協していました。ふとGitHub Cpilotに相談したら、下記のコードを教えてくれました。

using StarterAssets;
using UnityEngine;
using UnityStandardAssets.Utility;

[RequireComponent(typeof(WaypointProgressTracker))]
public class Waypoint1 : MonoBehaviour
{
	private WaypointProgressTracker tracker = null;
	private float speed = 16;
	private AudioSource sound1;
    private readonly float delay = 0.7f;
    private GameObject scoretext;
    internal float startDistance;

    void Start()
	{
		tracker = GetComponent<WaypointProgressTracker>();
		sound1 = GetComponent<AudioSource>();

        // 例: コースの100ユニット地点から開始
        tracker.GetType().GetField("progressDistance", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
            ?.SetValue(tracker, startDistance);

        // 実際の位置も合わせて初期化
        if (tracker.GetType().GetField("circuit", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
            ?.GetValue(tracker) is WaypointCircuit circuit)
        {
            transform.position = circuit.GetRoutePosition(startDistance);
        }
    }

	void Update()
	{
			Vector3 targetPosition = tracker.progressPoint.position + tracker.progressPoint.direction;
			transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);
			transform.LookAt(targetPosition);
	}

	void OnCollisionEnter(Collision collision)
	{
		if (collision.gameObject.CompareTag("Bullet"))
		{
			sound1.Play();
            gameObject.GetComponent<BoxCollider>().enabled = false;
            GetComponentInChildren<MeshRenderer>().enabled = false;
            Destroy(gameObject, delay);
        }
	}
}

ゲームに貼り付けてみると希望の動きです。他にも直したいと思っていた”CharacterController”の 接地判定”IsGrounded”の精度がイマイチなのを相談してみました。こちらは色々な答えを出してくれるので、その都度テストして問題点を伝えたのですが解決しませんでした。
GitHub Cpilotは無理とかダメとは言わず、問題点を伝えれば解決案がクルクル同じような繰り返しになっても飽きずに答え続けるようです。
それでもやりたい事を伝えれば答えが出て来るので、結局頼ってしまいます。きっと使い続ければ人間の脳がドンドン小さくなってしまうのだろうと思います。

コメント