場景轉換
在遊戲中我們經常會有場景轉換的使用,比如傳送陣等
那麼U3D中如何實現場景轉換呢?
假設我們現在有兩個如下場景:
那麼如何在這兩個場景中切換呢?
首先,打開下面的界面
然後再打開的界面中拖入我們的場景
最後我們要在兩個場景中分別創建一個腳本
注意腳本中首先引入命名空間
using UnityEngine.SceneManagement;
public void OnClickLoadScene()
{
SceneManager.LoadScene("Complete");
}
然後隨便綁定一個按鈕,就可以跳轉到想去的場景了。
關卡選擇
最終效果如下面幾張圖所示:
剛進入關卡界面:
點擊第一關並確定後(直接就開始算分了,得幾個星星自己挑):
這邊我選2顆星後確定:可以看到,第一關得了2顆星,第二關解鎖了
UI的搭建我就不演示了,直接貼出最終搭建好的UI層次
下面對上述UI做出解釋:
canvas:就是畫布
BackGround:整個大背景
windowBG:背景框(無所謂)
windowHead:上面的標題(無所謂)
接下來的很重要
levels:一個空對象,裏面添加一個grid網格組件用來排列關卡按鈕,levels裏面我寫了10個子對象,就是我們的關卡
level01:按鈕
Select:一張圖片,注意只在這一個關卡中創建這個,後面的不要(或者你乾脆不要,不影響功能,只是爲了看着舒服)
Text:用來顯示關卡編號
stars:星星背景框
star1–star3–star2:三個星星圖片
lock:小鎖圖片
AcceptButton:進入關卡場景按鈕
好啦,接下來開始寫腳本
首先,我們在levels裏面添加一個腳本CheckPointCotroller(選擇關卡控制器)
代碼如下:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class LevelsController : MonoBehaviour {
[Header("最高可挑戰的關卡")]
private int challengingLevel;
/// <summary>
/// 選擇框
/// </summary>
private Transform select;
private int currentLevelNum;
void Awake()
{
//找到選擇框
select = GameObject.FindWithTag("Select").transform;
}
void Start()
{
challengingLevel = Singleton.GetInstance().levelAndStars.Count + 1;
InitUI();
}
public void InitUI()
{
//初始化UI
for (int i = 0; i < transform.childCount; i++)
{
//找到第i個子對象(關卡)
Transform child = transform.GetChild(i);
Transform stars = child.Find("stars");
//更改子對象關卡編號
child.Find("Text").GetComponent<Text>().text = (i+1).ToString();
//如果當前關卡編號小於最高可挑戰關卡編號,就解鎖
if (i < challengingLevel)
{
//把小鎖圖片設爲非激活
child.Find("lockImage").gameObject.SetActive(false);
//讓關卡按鈕可以點擊
child.GetComponent<Button>().interactable = true;
//將解鎖後的關卡編號文字顏色變亮
child.Find("Text").GetComponent<Text>().color = new Color32(255, 234, 149,255);
//最新解鎖的關卡就解鎖以上內容直接continue
if (i + 1 == challengingLevel)
{
continue;
}
//將星星背景框激活
stars.gameObject.SetActive(true);
//根據各個關卡獲得的星星數激活指定數量的星星
switch (Singleton.GetInstance().levelAndStars[i + 1])
{
case 1:
stars.GetChild(0).gameObject.SetActive(true);
break;
case 2:
stars.GetChild(0).gameObject.SetActive(true);
stars.GetChild(2).gameObject.SetActive(true);
break;
case 3:
for (int j = 0; j < 3; j++)
{
stars.GetChild(j).gameObject.SetActive(true);
}
break;
default:
break;
}
}
}
}
//點擊關卡按鈕時響應此方法(傳入的是關卡編號)
public void CheckLevelByClick(int levelNum)
{
//獲取當前選擇的關卡
Transform currentLevel = transform.GetChild(levelNum - 1);
//選擇框的父對象變更爲當前選中的關卡
select.SetParent(currentLevel);
//選擇框放到最底層
select.SetSiblingIndex(0);
//選擇框位置變更到當前選擇的關卡
select.localPosition = Vector3.zero;
//保存當前選中的關卡編號(這裏也可以直接用單例對象接收)
currentLevelNum = levelNum;
}
//點擊對號按鈕時執行此方法
public void OnClickLoadScene()
{
//將當前關卡編號保存在單例中
Singleton.GetInstance().levelNum = currentLevelNum;
//跳轉場景
SceneManager.LoadScene("LevelComplete");
}
}
好,接下來我們把單例類寫好
using System.Collections.Generic;
public class Singleton {
//當前進入的關卡
public int levelNum;
//當前關卡中獲得的星星數量
public int getStars;
//定義字典用來存儲所有關卡信息
public Dictionary<int, int> levelAndStars;
//定義單例對象
private static Singleton instance;
//在構造中初始化字典
private Singleton()
{
levelAndStars = new Dictionary<int, int>();
}
//獲取單例
public static Singleton GetInstance()
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
//更新關卡信息方法(在complete場景中調用)
public void UpdateLevelStars()
{
if (levelAndStars.ContainsKey(levelNum))
{
if (levelAndStars[levelNum] < getStars)
{
levelAndStars[levelNum] = getStars;
}
}
else
{
levelAndStars.Add(levelNum, getStars);
}
}
}
接下來,另一個場景的UI如下
讀者可以不搭建那些花裏胡哨的東西,只看紅框中的就行
我們在每一個star中都添加一個腳本LevelComplete
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class LevelComplete : MonoBehaviour,IPointerEnterHandler{
[Header("第幾顆星")]
public int starIndex;
//獲取全部星星的此腳本
public LevelComplete[] stars;
//定義一個圖片組件用來修改透明度
private Image image;
//接收MouseX的返回值
private float mhor;
void Awake()
{
//初始化image
image = transform.GetComponent<Image>();
}
//當鼠標進入當前圖片
public void OnPointerEnter(PointerEventData eventData)
{
//獲取鼠標移動方向
mhor = Input.GetAxis("Mouse X");
//若大於0表示鼠標是自左向右劃,我們就點亮星星
if (mhor > 0)
{
ShowStars();
}
else
{
HideStars();
}
}
//根據點亮的是哪顆星星以決定要點亮幾顆星
public void ShowStars()
{
for (int i = 0; i < starIndex; i++)
{
stars[i].ChangeStarColorA(1);
}
//用單例保存獲得的星星數量
Singleton.GetInstance().getStars = starIndex;
}
//根據要熄滅哪個星以決定熄滅哪幾顆星
public void HideStars()
{
for (int i = 2; i >= starIndex - 1; i--)
{
stars[i].ChangeStarColorA(0);
}
//用單例保存獲得的星星數量
Singleton.GetInstance().getStars = starIndex - 1;
}
//改變星星圖片的透明度
public void ChangeStarColorA(int A)
{
image.color = new Color(image.color.r, image.color.g, image.color.b, A);
}
}
最後我們在complete場景裏的按鈕上添加以下腳本
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class CompleteAcceptButton : MonoBehaviour {
//定義按鈕
private Button btn;
void Awake()
{ //初始化按鈕
btn = transform.GetComponent<Button>();
}
void Start()
{ //在按鈕上綁定OnClickLoadScene事件
btn.onClick.AddListener(OnClickLoadScene);
}
//單擊按鈕的響應事件
private void OnClickLoadScene()
{
//執行單例的更新關卡信息方法
Singleton.GetInstance().UpdateLevelStars();
//切換場景
SceneManager.LoadScene("Checkpoint");
}
}
好了,關卡的UI就簡單的介紹到這裏。
點個關注,給個讚唄!