這次要來做轉珠遊戲中的關鍵要素─轉珠系統,全部完成可能需要六到七篇左右,第一篇就從產生盤面開始吧,下圖為這次的目標。
按下執行時,依照盤面的行列數產生相同數量的珠子,並且隨機賦予珠子屬性(不考慮消除)。
準備需要的圖檔資源。
在專案(Project)中新增Resources資料夾,並在Resources資料夾下新增Image資料夾。
在Image資料夾中新增背景圖、各屬性的珠子圖、珠子消除後的Null圖。
將全部圖檔的類型(Texture Type)修改成Sprite格式。
新增Canvas。
在階層中新增Canvas,並調整比例模式(UI Scale Mode)為Scale With Screen Size。
參照的解析度(Reference Resolution)為720X1280,數值可以依開發環境為基準。
新增背景圖物件(Background)。
在Canvas下新增Image物件,並選擇背景圖檔。
修改背景圖的座標原點至左下角(bottom left)。
修改圖檔的寬(Width)與高(Height)為720X600,可以依個人情況調整。
將支點(Pivot)設為(0, 0),也就是左下角。
新增珠子物件(Orb)。
新增Image物件作為珠子物件。
和背景圖相同,修改座標原點、寬高和支點。
將珠子物件設為Prefabs並新增腳本。
在Resources資料夾下新增Prefabs資料夾,並將珠子物件從階層拖曳至資料夾中。
在珠子物件上新增腳本Orb,Orb腳本會做珠子被新增時的初始化。
新增轉珠系統控制物件(PuzzleSystem)。
新增空物件PuzzleSystem並在上面新增腳本PuzzleSystem。
腳本PuzzleSystem會做整個系統的流程控制。
回到Orb腳本,新增珠子需要的變數。
using UnityEngine; using System.Collections.Generic; using UnityEngine.UI; public class Orb : MonoBehaviour { public enum OrbsType { Fire, Ice, Shine, Null };////(1) public OrbsType type;////(2) private Image image; void ChangeImage() { image.sprite = Resources.Load<Sprite>("Image/" + type);////(4) } void Start() { image = GetComponent<Image>(); ChangeImage();////(3) } }(1)宣告列舉OrbsType,包含所有珠子的屬性以及Null。
(2)宣告珠子的類型。
(3)宣告換圖用的函式,並在珠子初始化的時候執行一次。
(4)透過珠子的type更換圖片。
回到PuzzleSystem腳本,產生盤面中的珠子。
using UnityEngine; using System.Collections.Generic; public class PuzzleSystem : MonoBehaviour { public RectTransform BGRect;////(1) public int rowCount = 5; public int columnCount = 6; private Vector2 addPos = new Vector2(120, 120); void Start() { InitGrid(); } void InitGrid()////(2) { for (int r = 0; r < rowCount; r++) { for (int c = 0; c < columnCount; c++) { GameObject orbObj = Instantiate(Resources.Load("Prefabs/Orb")) as GameObject;////(3) RectTransform orbRect = orbObj.GetComponent<RectTransform>(); orbRect.SetParent(BGRect);////(4) orbRect.localScale = Vector2.one;////(5) orbRect.anchoredPosition = new Vector2(c * addPos.x, r * addPos.y);////(6) } } } }(1)新增變數,背景圖的RectTransform、盤面中行與列的珠子數、位移的距離。
(2)新增初始化盤面的函式InitGrid,函式當中使用兩層的迴圈,在盤面中每個位置新增珠子。
(3)產生珠子物件。
(4)設定珠子物件的父物件。
(5)設定比例。
(6)設定位置。
將背景圖物件帶入BGRect,執行結果如下。
可以看到依盤面珠子數量生成的結果,接著要隨機珠子的類型、以及有系統的修改珠子名稱。
回到Orb腳本,修改珠子名稱。
using UnityEngine; using System.Collections.Generic; using UnityEngine.UI; public class Orb : MonoBehaviour { . . . public int row; public int column; . . . void Start() { . . . transform.name = "orb" + row + column; . . . } }新增行變數column與列變數row,並在Start中使用行列變數修改transform.name。
回到PuzzleSystem腳本,初始化每個珠子。
using UnityEngine; using System.Collections.Generic; public class PuzzleSystem : MonoBehaviour { . . . void Start() { InitGrid(); } void InitGrid() { for (int r = 0; r < rowCount; r++) { for (int c = 0; c < columnCount; c++) { . . . Orb orb = orbObj.GetComponent<Orb>();////(1) orb.row = r; orb.column = c; OrbCreate(orb); } } } void OrbCreate(Orb orb)////(2) { int typeNum = Random.Range(0, (int)Orb.OrbsType.Null); orb.type = (Orb.OrbsType)typeNum; } }
(1)抓取珠子物件下的Orb腳本,修改Orb腳本下的row和column,接著呼叫OrbCreate函式。
(2)在OrbCreate函式中,使用Random隨機一個珠子類型編號,並且將該編號帶入珠子的類型中。
到這個階段執行會看到以下結果。
5X6盤面的初始化到這裡這一步就算完成了,接下來要新增調整盤面行列數量的功能。
回到Orb腳本,初始化珠子的大小。
using UnityEngine; using System.Collections.Generic; using UnityEngine.UI; public class Orb : MonoBehaviour { . . . public float width = 120; public float height = 120; . . . void Start() { . . . GetComponent<RectTransform>().sizeDelta = new Vector2(width, height); . . . } }新增珠子的寬width與高height,並在Start中修改sizeDelta。
回到PuzzleSystem腳本,做行列數值的調整。
using UnityEngine; using System.Collections.Generic; public class PuzzleSystem : MonoBehaviour { public RectTransform BGRect; public int rowCount = 5; public int columnCount = 6; private Vector2 addPos = new Vector2(120, 120); void Start() { InitGrid(); } void InitGrid() { addPos.y = BGRect.sizeDelta.y / rowCount; addPos.x = BGRect.sizeDelta.x / columnCount; for (int r = 0; r < rowCount; r++) { for (int c = 0; c < columnCount; c++) { . . . orb.height = BGRect.sizeDelta.y / rowCount; orb.width = BGRect.sizeDelta.x / columnCount; } } } }在進入迴圈前修改位移的xy,進入迴圈之後修改珠子的寬與高,數值如下。
珠子寬 = (背景圖寬/行數)、珠子高 = (背景圖高/列數)。
接著只要修改PuzzleSystem的rowCount和columnCount就可以調整盤面,以下是4X5和6X7的盤面。
這次就到這裡。
2016/08/06修正:
PuzzleSystem腳本中,有關OrbCreate函式的部分。
using UnityEngine; using System.Collections.Generic; public class PuzzleSystem : MonoBehaviour { . . . void Start() { InitGrid(); OrbCreate(); } void InitGrid() { for (int r = 0; r < rowCount; r++) { for (int c = 0; c < columnCount; c++) { . . . Orb orb = orbObj.GetComponent<Orb>();////(1) orb.row = r; orb.column = c; } } } void OrbCreate()////(2) { foreach (Orb orb in orbs) { if (orb.type == Orb.OrbsType.Null) { int typeNum = Random.Range(0, (int)Orb.OrbsType.Null); orb.type = (Orb.OrbsType)typeNum; } } }產生珠子屬性的OrbCreate函式,由於後續還會在其他地方呼叫,所以做了以上修正。
請問我的步驟做到要隨機珠子之前那裡
回覆刪除就整片要出來那裡
我的珠子會全部移位
珠子整片的左下角會剛好對到背景的質心
請問怎麼處理
謝謝
聽起來像是anchoredPosition給數值時有問題。
刪除方便結個圖嗎?
還有我是新手...
回覆刪除請問一下
成是你打下來的每串該怎麼銜接阿?
找到相同的函式或迴圈,新增追加的程式碼。
刪除其實我自己也覺得有點難懂,之後會想個容易看的方式。
你好,我想請問一下,
回覆刪除就是要怎麼讓遊戲畫面是直的,
我不管開幾次檔案他都是顯示橫的QQ感謝
是輸出apk後是橫的?還是在專案裡就是橫的?
刪除是專案裡可以看這篇
https://jerrard-liu.blogspot.tw/2016/07/GameView.html
輸出的話調整Player setting下的default orientation