吃豆人部分程式碼分析
吃豆人的專案下載地址,某位大神做的,亮點是參考地圖生成的部分
http://game.ceeger.com/forum/read.php?tid=160
地圖用一個txt檔案,如下圖的檔案,x表示牆的部分,.表示可吃的豆豆, O表示一些特殊種類的豆豆
O............X.....XXX.XX............O
.XXXXX.X.X.X.X.XXX...X....XXXX.XXXX.XX
.X.....X...X.XXX.XXX.X.X.XX.....X.X.XX
.X.XXX.XXXXX.......X.X.X.X..X.X.X.X.X.
然後看看程式碼 js寫的
var mapAsset : TextAsset;
var blockPrefab : Transform;
var pelletPrefab : Transform;
var superPrefab : Transform;
///看起來好像很簡單,可是實際操作時往往不知道從哪下手,簡單來說:
1確定這個虛擬世界的維度:這個地圖的維度是2,所以至少有兩個迴圈的
function Awake () {
var map = mapAsset.text.Split ("\n"[0]); //以回車符來劃分一行行的東西
var v = new Vector3 ();
v.y = 1.0;
var j_off = map.length / 2.0;
for (var j = 0; j < map.length; j ++) { //每一行
v.z = (map.length - j - j_off - 1) * 2;
var i_off = map[j].length / 2.0;
for (var i = 0; i < map[j].length; i ++) { //每一列的東西
v.x = (i - i_off) * 2 + 1;
if (map[j][i] == "X") { //字元 對應的 東西來擺放
var inst = Instantiate (blockPrefab, v, Quaternion.identity);
inst.transform.parent = transform;
} else if (map[j][i] == ".") {
Instantiate (pelletPrefab, v, Quaternion.identity);
} else if (map[j][i] == "O") {
Instantiate (superPrefab, v, Quaternion.identity);
}
}
}
}
再看看怪物是怎麼移動的
var howLong = 1.0; //每次移動長度
var howFast = 8.0; //多快?
private var nextUpdate = 0.0;
private var direction : Vector3;
function Update () {
if (Time.time > nextUpdate) {
nextUpdate = Time.time + (Random.value * howLong);
direction = Random.onUnitSphere; //球體的隨機分佈
direction.y = 0; //設定y=0後,球體的分佈趨向於圓心,可以抽象的想象中心的點比旁邊的更多
direction.Normalize (); //歸一化成1
direction *= howFast; //1* 速度
direction.y = 1.5 - transform.position.y;
}
var controller = GetComponent(CharacterController);
controller.Move(direction * Time.deltaTime);
}
//說實話 這個ai十分之蛋疼 到處亂跑, 可以修改之作為A*的專案