1. 单例模式
私有静态该类型变量,get,set函数(ctrl+r+e),Awake 函数里赋值。
1 public class Config : MonoBehaviour { 2 // 单例 3 private static Config instance; 4 5 public static Config Instance 6 { 7 get { return Config.instance; } 8 set { Config.instance = value; } 9 } 10 11 void Awake() 12 { 13 Instance = this; 14 } 15 }
2. 下拉框的使用(DropDown)
下拉框增加选项:
1 chooseLevelDropdown = chooseLevelGo.GetComponent<Dropdown>(); // 得到下拉框组件 2 List<string> levelsList = new List<string>(); // 选项存在 List 里面 3 for (int i = 1; i <= 100; ++i) 4 { 5 levelsList.Add(i + ""); 6 } 7 chooseLevelDropdown.ClearOptions(); // 清空选项 8 chooseLevelDropdown.AddOptions(levelsList); // 添加选项
获取已选择的选项的位置(第一个为 0):
chooseLevelDropdown.value
3. 选择关卡
根据下拉框选择值选择关卡:
1 // 选择关卡确定按钮 2 public void OnChooseLevelOkBtnClick() 3 { 4 chooseLevelGo.SetActive(false); // 隐藏选择关卡界面 5 // 保存输入的选择关卡数据 6 PlayerPrefs.SetInt("currentLevel", chooseLevelDropdown.value); 7 SceneManager.LoadScene(1); // 加载游戏场景 8 }
curLevel = PlayerPrefs.GetInt("currentLevel"); // 获取选择的关卡
4. 退出游戏
要考虑编辑器情况:
1 // 退出游戏按钮 2 public void OnCancelBtnClick() 3 { 4 #if UNITY_EDITOR 5 UnityEditor.EditorApplication.isPlaying = false; 6 #else 7 Application.Quit(); 8 #endif 9 }
5. 创建实体并将该实体放在当前组件下
1 // 创建实体,并将实体放在当前组件下 2 private GameObject CreateItem(GameObject createCameObject, Vector3 createPosition, Quaternion createRotation) 3 { 4 GameObject itemGo = Instantiate(createCameObject, createPosition, createRotation); // 创建实体 5 itemGo.transform.SetParent(gameObject.transform); // 放在该目录下 6 return itemGo; 7 }
7. 初始化地图
根据地图数组生成地图,并保存相应数据
1 // 初始化地图模型 2 private void InitMap() 3 { 4 curStep = 0; // 初始化当前步数为 0 5 curLevel = PlayerPrefs.GetInt("currentLevel"); // 获取选择的关卡 6 string[] level = Config.Instance.levels[curLevel].Split(",".ToCharArray()); // 加载当前关卡数据 7 for (int i = 0; i < level.Length; ++i) 8 { 9 string tmp = level[i]; // 第i行数据 10 for (int j = 0; j < tmp.Length; ++j) // 创建每一个方块 11 { 12 Vector3 pos = transform.position + new Vector3(1.23f * j, -1.23f * i, 0); 13 brickDatas[j, i] = int.Parse(tmp[j].ToString()); 14 if (brickDatas[j, i] >= 6) 15 { 16 currentPoint = new Vector2(); // 保存当前玩家位置 17 currentPoint.y = i; 18 currentPoint.x = j; 19 } 20 else if (brickDatas[j, i] == 3) // 记录空坑数量 21 { 22 numOfEmptyBrick++; 23 } 24 // 实例化 25 GameObject itemGo = CreateItem(brickPrefab, pos, Quaternion.identity); 26 brickRenderers[j, i] = itemGo.GetComponent<SpriteRenderer>(); // 获取渲染组件 27 } 28 } 29 }
8. 改变 SpriteRenderer 组件显示图片
修改 sprite 属性即可。
9. 字符串格式化输出
curStepText.text = string.Format("{0:000}", curStep);
10. 射线检测
1 public static int RaycastNonAlloc(Vector3 origin, Vector3 direction, RaycastHit[] results, float maxDistance = Mathf.Infinity, int layermask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);