Unity で作成した小さなデモの初歩
1、宇宙船などのシーンの設定
シーンレイアウト:ライトを適切な位置に配置し、カメラをライトの上に移動させ、シーン内に新しい quad を作成して背景として使用し、マテリアルを貼り付け、宇宙船プレイヤーをシーンにドラッグして位置を調整し、宇宙船の尾に炎のエフェクトを追加します。
2、宇宙船に飛行スクリプトを書く
Player.cs:
public float speed = 5.0f;
float moveH = Input.GetAxis("Horizontal");
float moveV = Input.GetAxis("Vertical");
Vector3 move = new Vector3(moveH, 0, moveV);
transform.Translate(speed * move * Time.deltaTime);
Unity で player.cs を宇宙船にドラッグして子オブジェクトとして設定します。これでキーボードの上下左右キーで宇宙船を操作できるようになります。
3、弾丸の飛行とプレハブ
Hierarchy で新しいゲームエンプティを作成し、名前を bolt とし、新しい quad を作成して bolt の子オブジェクトとして、マテリアルを貼り付け、弾丸のモデルを設定し、弾丸を宇宙船の下に配置し、弾丸の飛行スクリプト bolt_move.cs を作成します:
public float speed = 5.0f;
//z軸正方向に飛行
// フレームごとに更新
void Update () {
// transform.Translate(0,0,speed*Time .deltaTime);
transform.Translate(Vector3.forward * speed * Time.deltaTime);
同様にスクリプトを弾丸にドラッグします。
弾丸にリジッドボディコンポーネントとカプセルコライダーを追加します:
弾丸のプレハブを作成し、_prefab に配置します:
Hierarchy の bolt を Assets の_prefab にドラッグするだけで大丈夫です。
4、弾丸の発射
弾丸発射用のスクリプトを作成し、player に配置します:
//時間間隔
public float fireRate = 0.5f;
//0.5fごとに弾丸を発射
public float nextFire = 0.0f;
public GameObject shot;
public Transform shotSpawn;
//マウスをクリックして弾丸を発射
if (Input.GetButton("Fire1") && Time.time > nextFire)
{
//問題のある弾丸が出てきたので、時間で弾丸の発射を制御する必要があります
nextFire = Time.time + fireRate;
//Instantiate(オブジェクトをインスタンス化する‘位置’角度)
Instantiate(shot, shotSpawn.position, shotSpawn.rotation);
player をクリックし、インスペクタで設定を完了します:
実行すると、弾丸が飛行機の下から発射されます。
5、弾丸の破壊と衝突検出
新しい cube を作成し、名前を boundary とし、サイズと位置を調整して宇宙船を囲むようにします。
弾丸破壊用のスクリプト destbyboundary.cs を作成します:
void OnTriggerExit(Collider other)
{
Destroy(other.gameObject);
}
これを boundary にドラッグします:
関連設定は以下の通りです。
実行すると、弾丸が boundary の境界を飛び出すと破壊されます。
6、隕石の動きと破壊を追加
新しい gameobject を作成し、名前を Asterial とし、隕石モデルを子オブジェクトとしてドラッグし、シーン内の位置を調整し、動きのスクリプト as_move.cs を作成します:
public float speed = 5.0f;
void Update () {
transform.Translate(Vector3.back * speed * Time.deltaTime);
}
リジッドボディコンポーネントとカプセルコライダーを追加します。
同時にプレハブを作成し、自動的に出現させます。
7、タグを追加
as_move.cs スクリプトに以下のコードを追加します:
// 小惑星のリジッドボディとコライダーのトリガー、boundary にはコライダーのトリガーがあり、トリガーに入ると自然に反応します。
void OnTriggerEnter(Collider other)
{
//print(other.name);//対応する名前はboundaryで、破壊はboundaryなので、少し修正が必要です
//パーティクルオブジェクトをインスタンス化
if (other.tag == "Boundary")
return;
gameController.GameOver();
Destroy(other.gameObject);
}
ここで属性の応答を修正します。
8、隕石と宇宙船の爆発
as_move.cs に以下のコードを追加します:
public GameObject explosion;
public GameObject playerExplosion;
//小惑星の位置で爆発パーティクルエフェクトをインスタンス化
Instantiate(explosion, transform.position, transform.rotation);
//宇宙船の位置で爆発エフェクトをインスタンス化
if (other.tag == "Player")
{
Instantiate(playerExplosion, other.transform.position, other.transform.rotation);
}
Destroy(other.gameObject);
//小惑星が撃たれた後、プレイヤーのスコアが増加するため、このプロセスをTextコントロールに通知する必要があります
gameController.AddScore(scoreValue);
Destroy(gameObject);
}
設定は以下の通りです。
実行すると、隕石を撃った後の爆発エフェクトが表示されます。
9、隕石の大量生成:
ここでコルーチンの方法を使用します:
IEnumerator WaitAndPrint()
{
yield return new WaitForSeconds(5);
print(“WaitAndPrint”+Time.time);
}
新しい gameobject を作成し、名前を gamecontroller とし、スクリプト gamecontroller.cs を作成します:
//小惑星のオブジェクトをインスタンス化し、位置を設定
public GameObject hazard;//小惑星オブジェクトを表す
public Vector3 spawnValues;//生成されるx軸とz軸の変化値を表す
private Vector3 spawnPosition = Vector3.zero;//生成位置を表す
private Quaternion spawnRotation;
public int hazardCount = 6;
//遅延生成の時間
public float spawnWait;
//ゲームが始まった時にすぐに小惑星を生成したくないので、待機時間を制御するための変数を追加します
public float startWait = 1.0f;
//小惑星を生成するコード
IEnumerator SpawnWaves()
{
yield return new WaitForSeconds(startWait);
while (true)
{
for (int i = 0; i < hazardCount; i++)
{
spawnPosition.x = Random.Range(-spawnValues.x, spawnValues.x);
spawnPosition.z = spawnValues.z;
spawnRotation = Quaternion.identity;
Instantiate(hazard, spawnPosition, spawnRotation);
yield return new WaitForSeconds(spawnWait);
}
yield return new WaitForSeconds(2.0f);
void Start () {
StartCoroutine(SpawnWaves());
}
シーン設定に必要なパラメータを設定します。
実行すると、隕石がランダムに生成されます。
10、異なるスクリプト間でのデータ伝達を行い、ゲームのライフサイクルを作成します:得点を記録し、ゲームを終了し、再スタートします。
as_move.cs に以下のコードを追加します:
private GameController gameController;
public int scoreValue;//増加するスコア
gameController.GameOver();
void Start()
{
//ここで定義したgamecontrollerと以前のgamecontrollerをバインドします。一般的には
//まずfindwithtagでオブジェクトを見つけ、getcomponentでgamecontrollerスクリプトを見つけます
GameObject go = GameObject.FindWithTag("GameController");//注意、属性応答のところで修正が必要です
if (go != null)
gameController = go.GetComponent<GameController>();
else
Debug.Log("tagがGameControllerのオブジェクトが見つかりません");
if (gameController == null)
Debug.Log("スクリプトGameController.csが見つかりません");
}
gamecontroller.cs に以下のコードを追加します:
public Text ScoreText;
private int score;
public Text gameOverText;
private bool gameOver;
public Text restartText;
private bool restart;
if (gameOver)
{
restartText.text = "【R】を押して再スタート";
restart = true;
break;
}
}
}
// 初期化に使用
void Start () {
score = 0;
ScoreText.text = "得点: " + score;
gameOverText.text = "";
gameOver = false;
restartText.text = "";
restart = false;
StartCoroutine(SpawnWaves());
}
//スコアを修正
public void AddScore(int newScoreValue)
{
score += newScoreValue;
ScoreText.text = "得点: " + score;
}
//終了の属性を修正
public void GameOver()
{
gameOver = true;
gameOverText.text = "ゲーム終了";
}
void Update()
{
if (restart)
{
if (Input.GetKeyDown(KeyCode.R))
Application.LoadLevel(Application.loadedLevel);
}
シーンで以下の設定を行います:
これで、宇宙船の小さなゲームが基本的に完成しました。
ゲームを実行します: