```csharp= using System.Collections; using System.Collections.Generic; using UnityEngine; public class Generator : MonoBehaviour { // Camera 寬度:-14~14 public GameObject platformPrefab; // 產生不會動的地板 public GameObject platformOncePrefab; // 產生只能採一次的地板 public GameObject platformMovingPrefab; // 產生會移動的地板 public GameObject BigCoin; // * public GameObject SmallCoin; // * public GameObject Apple; // * public GameObject Enemy; // * public Transform player; // Player物件 float player_Y = 0f; // 紀錄Player最一開始的的X座標 float player_X = 0f; // 紀錄Player最一開始的Y座標 float playerNowPo = 0f; // 紀錄Player當下的Y座標 float movingRange = 0f; // 紀錄移動地板產生的X座標 bool first = true; // 紀錄是不是第一次生成 public int mode = 0; // 紀錄生成的次數(當作模式的一種,數字越大越難) int appleDistance = 3; // * int numberOfPlatforms = 20; // 產生地板的數量 int applePro = 0; // * int coinPro = 0; // * int enemyPro = 0; // * int enemyMaxPro = 20; public int probability = 95; // 產生採一次地板的機率 public int proMoving = 1000; // 產生移動地板的機率 private float levelWidth = 10f; // 產生地板的寬度 [SerializeField] private float minY = 3f; // 產生地板的最小高度 [SerializeField] private float maxY = 4f; // 產生地板的最大高度 [SerializeField] private float generate = 40f; // 當距離大於這個,表示需要產生地板了 public float testing = 0f; // 看數據OwO float height = 0; // 紀錄產生的地板中最高的 void Start() { Camera camera = Camera.main; // Main Camera player_Y = player.position.y; // 紀錄Player最一開始的Y座標 player_X = camera.transform.position.x; // 紀錄Camera的X座標 GeneralPlatform(first); // 產生地板 mode++; first = false; // 初始化第一次產生 } void Update() { playerNowPo = player.position.y; // 紀錄Player當下的高度 testing = playerNowPo - player_Y; if (playerNowPo - player_Y > generate) { mode++; player_Y = playerNowPo; if (mode <= 2) // * { GeneralPlatform(first); } else if (mode >= 3 && mode < 5) // 第二難度 // * { numberOfPlatforms = 10; minY = 6f; // * maxY = 8f; // * generate = 60; GeneralPlatform(first); } else if (mode >= 5) // 第三難度 // * { enemyMaxPro = 10; appleDistance--; // * if (mode > 30) // 第四難度 // * proMoving = 80; minY = 8f; maxY = 12f; generate = 80; GeneralPlatform(first); } if (appleDistance < 0) // * appleDistance = 0; } } void GeneralPlatform(bool first) { Vector3 spawnPosition = new Vector3(); applePro = Random.Range(0, 10); // * enemyPro = Random.Range(3, 10); // * int moneyOrPlatform = Random.Range(1, 5); // * if (first) // 第一次生成時,生成的高度要跟Player一樣,不是第一次生成時,需要用目前最高的地板的高度 { spawnPosition = player.position; } else { spawnPosition = new Vector3(0, height, 0); } if (moneyOrPlatform == 1 && !first) // * { spawnPosition.y += Random.Range(minY, maxY); // 生成地板的高度 int moneyMode = Random.Range(1, 4); switch (moneyMode) { case 1: // Stairs for(int i = 0; i < 26; i++) { int bOS = Random.Range(1, 26); if(bOS == 1) { if(i < 6) Instantiate(BigCoin, new Vector3(16 - i * 5, spawnPosition.y + i * 4, 0), Quaternion.identity); else if(i < 11) Instantiate(BigCoin, new Vector3(-9 + (i - 5) * 5, spawnPosition.y + i * 4, 0), Quaternion.identity); else if(i < 16) Instantiate(BigCoin, new Vector3(16 - (i - 10) * 5, spawnPosition.y + i * 4, 0), Quaternion.identity); else if(i < 21) Instantiate(BigCoin, new Vector3(-9 + (i - 15) * 5, spawnPosition.y + i * 4, 0), Quaternion.identity); else if(i < 26) Instantiate(BigCoin, new Vector3(16 - (i - 20) * 5, spawnPosition.y + i * 4, 0), Quaternion.identity); } else if(bOS == 2) { if (i < 6) Instantiate(Apple, new Vector3(16 - i * 5, spawnPosition.y + i * 4, 0), Quaternion.identity); else if (i < 11) Instantiate(Apple, new Vector3(-9 + (i - 5) * 5, spawnPosition.y + i * 4, 0), Quaternion.identity); else if (i < 16) Instantiate(Apple, new Vector3(16 - (i - 10) * 5, spawnPosition.y + i * 4, 0), Quaternion.identity); else if (i < 21) Instantiate(Apple, new Vector3(-9 + (i - 15) * 5, spawnPosition.y + i * 4, 0), Quaternion.identity); else if (i < 26) Instantiate(Apple, new Vector3(16 - (i - 20) * 5, spawnPosition.y + i * 4, 0), Quaternion.identity); } else { if (i < 6) Instantiate(SmallCoin, new Vector3(16 - i * 5, spawnPosition.y + i * 4, 0), Quaternion.identity); else if (i < 11) Instantiate(SmallCoin, new Vector3(-9 + (i - 5) * 5, spawnPosition.y + i * 4, 0), Quaternion.identity); else if (i < 16) Instantiate(SmallCoin, new Vector3(16 - (i - 10) * 5, spawnPosition.y + i * 4, 0), Quaternion.identity); else if (i < 21) Instantiate(SmallCoin, new Vector3(-9 + (i - 15) * 5, spawnPosition.y + i * 4, 0), Quaternion.identity); else if (i < 26) Instantiate(SmallCoin, new Vector3(16 - (i - 20) * 5, spawnPosition.y + i * 4, 0), Quaternion.identity); } if (i == 25) { spawnPosition.y += i * 4; height = spawnPosition.y; } } break; case 2: // YA for(int k = 0; k < 3; k++) { spawnPosition.y += 4; for (int i = 0; i < 6; i++) { for (int j = 0; j < 16; j++) { int bOS = Random.Range(1, 26); if(bOS == 1) { switch (i) { case 5: if (j == 0 || j == 6 || j == 10) Instantiate(BigCoin, new Vector3(-9 + j * 1.6f, spawnPosition.y + i * 4, 0), Quaternion.identity); break; case 4: if (j == 1 || j == 5 || j == 9 || j == 11) Instantiate(BigCoin, new Vector3(-9 + j * 1.6f, spawnPosition.y + i * 4, 0), Quaternion.identity); break; case 3: if (j == 2 || j == 4 || j == 8 || j == 12) Instantiate(BigCoin, new Vector3(-9 + j * 1.6f, spawnPosition.y + i * 4, 0), Quaternion.identity); break; case 2: if (j == 3 || j == 7 || j == 9 || j == 11 || j == 13) Instantiate(BigCoin, new Vector3(-9 + j * 1.6f, spawnPosition.y + i * 4, 0), Quaternion.identity); break; case 1: if (j == 3 || j == 6 || j == 14) Instantiate(BigCoin, new Vector3(-9 + j * 1.6f, spawnPosition.y + i * 4, 0), Quaternion.identity); break; case 0: if (j == 3 || j == 5 || j == 15) Instantiate(BigCoin, new Vector3(-9 + j * 1.6f, spawnPosition.y + i * 4, 0), Quaternion.identity); break; } } else if (bOS == 2) { switch (i) { case 5: if (j == 0 || j == 6 || j == 10) Instantiate(Apple, new Vector3(-9 + j * 1.6f, spawnPosition.y + i * 4, 0), Quaternion.identity); break; case 4: if (j == 1 || j == 5 || j == 9 || j == 11) Instantiate(Apple, new Vector3(-9 + j * 1.6f, spawnPosition.y + i * 4, 0), Quaternion.identity); break; case 3: if (j == 2 || j == 4 || j == 8 || j == 12) Instantiate(Apple, new Vector3(-9 + j * 1.6f, spawnPosition.y + i * 4, 0), Quaternion.identity); break; case 2: if (j == 3 || j == 7 || j == 9 || j == 11 || j == 13) Instantiate(Apple, new Vector3(-9 + j * 1.6f, spawnPosition.y + i * 4, 0), Quaternion.identity); break; case 1: if (j == 3 || j == 6 || j == 14) Instantiate(Apple, new Vector3(-9 + j * 1.6f, spawnPosition.y + i * 4, 0), Quaternion.identity); break; case 0: if (j == 3 || j == 5 || j == 15) Instantiate(Apple, new Vector3(-9 + j * 1.6f, spawnPosition.y + i * 4, 0), Quaternion.identity); break; } } else { switch (i) { case 5: if (j == 0 || j == 6 || j == 10) Instantiate(SmallCoin, new Vector3(-9 + j * 1.6f, spawnPosition.y + i * 4, 0), Quaternion.identity); break; case 4: if (j == 1 || j == 5 || j == 9 || j == 11) Instantiate(SmallCoin, new Vector3(-9 + j * 1.6f, spawnPosition.y + i * 4, 0), Quaternion.identity); break; case 3: if (j == 2 || j == 4 || j == 8 || j == 12) Instantiate(SmallCoin, new Vector3(-9 + j * 1.6f, spawnPosition.y + i * 4, 0), Quaternion.identity); break; case 2: if (j == 3 || j == 7 || j == 9 || j == 11 || j == 13) Instantiate(SmallCoin, new Vector3(-9 + j * 1.6f, spawnPosition.y + i * 4, 0), Quaternion.identity); break; case 1: if (j == 3 || j == 6 || j == 14) Instantiate(SmallCoin, new Vector3(-9 + j * 1.6f, spawnPosition.y + i * 4, 0), Quaternion.identity); break; case 0: if (j == 3 || j == 5 || j == 15) Instantiate(SmallCoin, new Vector3(-9 + j * 1.6f, spawnPosition.y + i * 4, 0), Quaternion.identity); break; } } } if (i == 5) { spawnPosition.y += i * 4; height = spawnPosition.y; } } } break; case 3: // A lot of line. for (int k = 0; k < 3; k++) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 6; j++) { int bOS = Random.Range(1, 26); if(bOS == 1) { Instantiate(BigCoin, new Vector3(-9 + j * 5, spawnPosition.y + i * 4, 0), Quaternion.identity); } else if(bOS == 2) { Instantiate(Apple, new Vector3(-9 + j * 5, spawnPosition.y + i * 4, 0), Quaternion.identity); } else { Instantiate(SmallCoin, new Vector3(-9 + j * 5, spawnPosition.y + i * 4, 0), Quaternion.identity); } } if (i == 2) { spawnPosition.y += i * 4; height = spawnPosition.y; } } spawnPosition.y += 10; } break; } } else { for (int i = 0; i < numberOfPlatforms; i++) { spawnPosition.y += Random.Range(minY, maxY); // 生成地板的高度 if (i == numberOfPlatforms - 1) // 記憶生成物件的最高點 height = spawnPosition.y; spawnPosition.x = Random.Range(-levelWidth + player_X, levelWidth + player_X); // 生成地板的範圍 movingRange = Random.Range(-levelWidth + player_X + 4, levelWidth + player_X - 4); // 生成地板的範圍(移動地板) int random = Random.Range(1, 101); // 機率 if (random <= probability) { Instantiate(platformOncePrefab, spawnPosition, Quaternion.identity); } else if (random <= proMoving + 5) { spawnPosition.x = movingRange; Instantiate(platformMovingPrefab, spawnPosition, Quaternion.identity); } else { if (i == enemyPro) { int leftOrRight = Random.Range(1, 3); int upOrDown = Random.Range(1, 3); if (leftOrRight == 1) // left { for (int j = 0; j < 3; j++) { Instantiate(platformPrefab, new Vector3(-8 + j * 6.5f, spawnPosition.y), Quaternion.identity); } if (upOrDown == 1) // Up Instantiate(Enemy, new Vector3(-8, spawnPosition.y + 4), Quaternion.identity); else if (upOrDown == 2) // Down Instantiate(Enemy, new Vector3(-8, spawnPosition.y - 4), Quaternion.identity); } else if (leftOrRight == 2) // right { for (int j = 0; j < 3; j++) { Instantiate(platformPrefab, new Vector3(14 - j * 6.5f, spawnPosition.y), Quaternion.identity); } if (upOrDown == 1) // Up Instantiate(Enemy, new Vector3(1, spawnPosition.y + 4), Quaternion.identity); else if (upOrDown == 2) // Down Instantiate(Enemy, new Vector3(1, spawnPosition.y - 4), Quaternion.identity); } } else { Instantiate(platformPrefab, spawnPosition, Quaternion.identity); if (i == applePro) // * { Instantiate(Apple, spawnPosition + new Vector3(0, 3, 0), Quaternion.identity); spawnPosition.y += appleDistance; } } } } } } } ```