游戲中小地圖的實現(xiàn)(場景用簡單Cube組成先搭建如下圖場景味赃,真實場景實現(xiàn)方法也是一樣)
1.創(chuàng)建好場景后先添加一個攝像機鼠標右鍵出現(xiàn)如圖1-2所示選擇Camera就建好了一個攝像機
2.新建如圖1-5所示的Render Texture(紋理渲染)
3.選中攝像機在右邊出來的組件Camera中設置如圖1-4所示的Culling Mask屬性為Default
4.在將如圖1-4所示的Camera組件中的Projection 屬性設置為正交視圖(如圖1-5所示并調整好他的位置讓他的視圖對準要顯示的物體)
5.將第二步建的Render Texture(紋理渲染)拖到圖1-4所示組件的Taget Texture屬性中.
6.刪除圖1-4所示組件中Audio Listener屬性(不然運行起來會一直輸出東西)
7.加入一個Image右鍵UI --->Image并給該Image添加遮障如圖1-6所示添加遮障(Mask)
8.在該Image下添加一個RawImage組件把如圖1-3所建Render Texture(紋理渲染)拖在如圖1-7所示的Texture上(表示指向掩碼圖片)
9.為運動物體添加移動腳本實現(xiàn)物體移動就可以實現(xiàn)簡單的小地圖功能腳本內容如下
void Update () {
float h = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
transform.Translate(new Vector3(h, 0, z) * 6);//speed為速度
}
游戲關卡選擇的簡單實現(xiàn)
效果圖如圖2-1所示
布局層次如圖2-2所示
Seal:背景圖片
Grid:控制顯示出來的網(wǎng)格布局
Title:顯示關卡選則界面
LeverItem:Image組件控制點擊后實現(xiàn)高亮狀態(tài)
Icon:顯示圖片
startGrid:顯示小紅點(下面的start1分別表示三個)
LeverInfo:關卡名字與關卡數(shù)
1.添加一個一個Image作為背景圖(Seal 顯示背景顏色)
2.在背景圖下面添加一個空物體(Grid)控制顯示出來的關卡圖片布局所以添加Grid Layout Group組件與Toggle Group組件(控制選中后高亮狀態(tài)只有一張會亮似谁,其他為暗)如圖2-3所示
3.添加一個Image控件 :LeverItem來控制顯示單個關卡的圖片狀態(tài)的切換宪躯,高亮狀態(tài)(nomal_BG)與非高亮狀態(tài)(Hight_side)渠退,就是添加倆個Image背景分別設為暗一點與亮一點就行
在添加一張圖片(Icon)背景為顯示關卡的圖片尺寸比那倆張圖片要小一點
為LeverItem添加Toggle組件(圖2-4)
在(1)處拉入LeverItem
在(2)處拉入當前默認的非高亮狀態(tài)
在(3)處拉入Gird
在腳本中可以通過Is On來控制倆種狀態(tài)的切換
4.startGrid與LeverInfo就是設置一下關卡與名字的顯示布局與星級的顯示布局
腳本實現(xiàn)
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Collections.Generic;
public class shijianbuju : MonoBehaviour {? ?
?Canvas _mainCanvas;? ??
AsyncOperation _state;?
?? SelctLeverIUI _guankaid; ??
?? void Start () {? ??
? ? CreatLeverItem();? ?
?? ? ? ? }? ??
public int level_id;//關卡ID? ?
?Transform _ItemPareten;? ??
GameObject _leverIItem;??
? ListdataGruop = new List();??
? public void Awake()? ? {??
? ? ? CreatTempData();? ? ??
? DontDestroyOnLoad(gameObject);//不銷毀物體在場景加載的時候盈魁,或切換時? ? ??
? ? ? ? ? _ItemPareten = transform.Find("Seal/Grid");? ??
? ? _leverIItem = transform.Find("Seal/LeverItem").gameObject;? ? }? ?
?//創(chuàng)建臨時數(shù)據(jù)? ?
?void CreatTempData()? ? {??
? ? ? dataGruop.Clear();? ??
? ? LeveIData leveldata = new LeveIData();??
? ? ? leveldata.level_id = 1;? ? ?
?? leveldata._levelName = "小樹林";? ??
? ? leveldata._Nolevel = 1;? ? ? ?
?leveldata._starNum = 3;? ? ??
? leveldata._IconRes = "1 (1)";??
? ? ? dataGruop.Add(leveldata);? ? ??
? LeveIData leveldata1 = new LeveIData();? ?
?? ? leveldata1.level_id = 2; ?
?? ? leveldata1._levelName = "土地廟";??
? ? ? leveldata1._Nolevel = 2;? ? ? ?
?leveldata1._starNum = 2;? ? ??
? leveldata1._IconRes = "1 (2)";? ??
? ? dataGruop.Add(leveldata1);? ? ?
?? LeveIData leveldata2 = new LeveIData();? ? ? ?
?leveldata2.level_id = 3;? ??
? ? leveldata2._levelName = "神仙閣";? ?
?? ? leveldata2._Nolevel = 3;? ? ?
?? leveldata2._starNum = 3;? ? ??
? leveldata2._IconRes = "1 (3)";? ?
?? ? dataGruop.Add(leveldata2);? ??
? ? LeveIData leveldata3 = new LeveIData();?
?? ? ? leveldata3.level_id = 4;? ?
?? ? leveldata3._levelName = "少林寺";? ?
?? ? leveldata3._Nolevel = 4;? ?
?? ? leveldata3._starNum = 1;? ? ?
?? leveldata3._IconRes = "1 (4)";? ? ?
?? dataGruop.Add(leveldata3);?
?? ? ? LeveIData leveldata4 = new LeveIData();??
? ? ? leveldata4.level_id = 5;? ? ?
?? leveldata4._levelName = "黑木崖";??
? ? ? leveldata4._Nolevel = 5;? ? ??
? leveldata4._starNum = 3;? ? ??
? leveldata4._IconRes = "1 (5)";? ? ? ?
?dataGruop.Add(leveldata4);? ? }?
?? //根據(jù)數(shù)據(jù)創(chuàng)建關卡??
? GameObject _tempItem;? ??
void CreatLeverItem()? ? {? ?
?? ? if (dataGruop.Count > 0)? ? ? ? {??
? ? ? ? ? for (int i = 0; i < dataGruop.Count; i++)? ??
? ? ? ? {? ? ? ? ? ?
?? ? _tempItem = Instantiate(_leverIItem) as GameObject;? ? ? ? ? ? ? ? _tempItem.transform.SetParent(_ItemPareten);? ??
? ? ? ? ? ? _tempItem.transform.localPosition = Vector3.zero;
? ? ? ? ? ? ? ? _tempItem.transform.localScale = Vector3.one;? ??
? ? ? ? ? ? _tempItem.transform.localRotation = new Quaternion();? ? ? ?
?? ? ? ? //處理數(shù)據(jù)? ? ? ? ? ??
? ? LeverItem _InstItem = _tempItem.AddComponent();? ?
?? ? ? ? ? ? _InstItem.InstValue(dataGruop[i].level_id);? ?
?? ? ? ? ? ? _InstItem._name.text = dataGruop[i]._levelName;?
?? ? ? ? ? ? ? _InstItem._NoLevel.text = dataGruop[i]._Nolevel.ToString();? ? ?
?? ? ? ? ? string path = string.Format("{0}{1}", "Icon/", dataGruop[i]._IconRes);? ?
?? ? ? ? ? ? _InstItem._icon.sprite = Resources.Load(path, typeof(Sprite)) as Sprite;? ? ? ? ? ? ? ? ShowStar(dataGruop[i]._starNum, _InstItem);? ? ? ??
? ? ? ? //增加監(jiān)聽? ? ? ? ? ? ? ??
_tempItem.GetComponent().onValueChanged.AddListener(delegate (bool ischange) { OntoggleChngeFunc(ischange, _InstItem); });
}
}
}
void OntoggleChngeFunc(bool ison, LeverItem item)
{
if (ison)
{
// Debug.Log("my level_id=" + item.level_id);
SceneManager.LoadScene(item.level_id);
}
}
void ShowStar(int num, LeverItem item)
{
if (num == 1)
{
item._star_one.gameObject.SetActive(true);
item._star_two.gameObject.SetActive(false);
item._star_thr.gameObject.SetActive(false);
}
else if (num == 2)
{
item._star_one.gameObject.SetActive(true);
item._star_two.gameObject.SetActive(true);
item._star_thr.gameObject.SetActive(false);
}
else if (num == 3)
{
item._star_one.gameObject.SetActive(true);
item._star_two.gameObject.SetActive(true);
item._star_thr.gameObject.SetActive(true);
}
}