這次比較複雜,可以參考DB_TEST.zip檔
(本來是用來測連資料庫範例的,但後來測其它的也寫在那就是了)
https://onedrive.live.com/redir?resid=B90617D056EA2F32!184&authkey=!AFCnMULCyD45X30&ithint=folder%2czip昨天睡前突然想到
要移植HTML5文字型冒險遊戲還有兩件事被我忽略了
第一件事情就是Unity的滑鼠點擊事件要靠碰撞器
也就是說似乎沒有按滑鼠就觸發Click事件
關於這件事情我是採取建個透明物件蓋住主攝影機
實作方式可參考↓(對岸Unity相關網站-遊戲蠻牛)
http://www.unitymanual.com/thread-4591-1-1.html主要靠縮放物件(快速鍵R)跟調透明度達成
第二件事就是,遊戲選項的處理
遊戲選項是由遊戲選項圖跟遊戲選項文字組成的
這在Unity中可透過Prefab來處理
具體實作方式可參考Unity 官方網頁
http://docs.unity3d.com/Manual/InstantiatingPrefabs.html的Now we only need to create the Prefab, which we do in the Editor. Here’s how:
之下有六步驟(由於範例有要處理碰撞所以有設剛體,那步在我檔案中就沒做了)
我是把遊戲選項Cube跟遊戲選項文字3D Text拉在一塊設Prefab
我的Prefab放在Resources資料夾內(為了使用Resources.Load()方法)
然後還有給個標籤名是brick(磚塊)
給標籤名是為了在選取遊戲選項後統一刪除用的
那這次用來測遊戲選項功能的程式有三部分:
第一部分是每次滑鼠點擊都去觸動的(因此我把這程式檔掛在很大的隱形Cube1上)
在Start()內產生四個遊戲選項用來測試
option_flag是用來在選選項時
不去觸動滑鼠點擊的程式
預設值在Start()內給的原因是
在宣告時給會出現編譯錯誤
(具體原因不清楚,我是想說能在其它程式片段改值,影響應該不大就不特別理會了)
using UnityEngine;
using System.Collections;
public class game_main : MonoBehaviour {
public static string[] text1;
public static int text1_line_no=0;
public static bool option_flag;
WWW request;
IEnumerator Start () {
option_flag = true;
//request = new WWW ("file:///"+Application.dataPath + @"/game0.txt"); //Unity preview
request = new WWW (Application.dataPath + @"/game0.txt"); //build Web Player use
yield return request;
text1 = request.text.Split('\n');
Instantiate(Resources.Load("Brick") as GameObject, new Vector3(0, 4, -10), Quaternion.identity);
//注意預設單位,1是100pixel
Instantiate(Resources.Load("Brick") as GameObject, new Vector3(0, 2, -10), Quaternion.identity);
Instantiate(Resources.Load("Brick") as GameObject, new Vector3(0, 0, -10), Quaternion.identity);
Instantiate(Resources.Load("Brick") as GameObject, new Vector3(0, -2, -10), Quaternion.identity);
}
void OnMouseDown() {
if (!option_flag) {
//something to do
}
}
}
--------------------------------------------------------------
第二部分是滑鼠選項的部分(也就是掛在Prefab中Cube的部分)
一次刪掉同標籤物件的做法可參考此程式
然後有Resources.UnloadUnusedAssets ();的原因是
Destroy似乎只會刪掉物件本身
至於使用的Material等是不會刪的
在多次使用後,那些累積占用的記憶體可能會大到足以影響遊戲速度
那就要靠這方法解決
只是以目前的程式可能看不出效果
所以我也不清楚這麼寫有沒有用就是了
(話說我Prefab中Cube部分根本沒套用Material嘛)
using UnityEngine;
using System.Collections;
public class after_click : MonoBehaviour {
GameObject[] brick;
void OnMouseDown(){
brick=GameObject.FindGameObjectsWithTag ("brick");
foreach (GameObject g_o in brick) {
Destroy (g_o);
}
Resources.UnloadUnusedAssets ();
game_main.option_flag = false;
}
}
---------------------------------------------------------------
第三部分是掛在Prefab中3D Text
所以要看的話可能要從Project視窗把Brick拖出來
再展開Brick點3D Text才會看到上面有掛text_linenumber.cs檔
由於遊戲主程式還沒寫好
文字就顯示文字檔頭四行
game_main.text1_line_no++;這行為什麼不寫在game_main.cs中呢?
因為我寫在那邊的話
執行出來的效果是四個選項文字內容都是文字檔第四行
原因不清楚,可能是程式執行順序的問題
由於改成這樣結果就符合預期
就沒怎麼去研究為什麼會這樣了
using UnityEngine;
using System.Collections;
public class text_linenumber : MonoBehaviour {
void Start () {
GetComponent<TextMesh> ().text =game_main.text1[game_main.text1_line_no];
game_main.text1_line_no++;
}
}
---------------------------------------------
話說現在才注意到
我還沒有記錄哪個選項被選
嗯...我再想想看要怎麼改
改好後再重傳檔案,跟改下這篇文章內容
不清楚會改多久!!
那就先這樣
---------------3/11 22:18修改完畢----------
DB_TEST.zip重傳了
思考了下,話說這類選項好像用OnGUI效果就蠻不錯的
不用寫OnMouseOver,應該也不用Destroy顯示用的物件
不過用OnGUI要怎麼記錄哪個選項被點還沒研究
稍微研究了下怎麼記錄是哪個選項被點後
感覺好像Unity官方範例就有約略提了下
http://docs.unity3d.com/ScriptReference/Object.Instantiate.html改了兩個檔game.main.cs(掛在Cube1上)
跟after_click.cs(掛在Prefab的Brick上,Resources資料夾內)
主要就是動態產生物件時用個Object存下
再更改它的屬性值
使用起來像:
Object g_o1;
g_o1=Instantiate(Resources.Load("Brick") as GameObject, new Vector3(0, 4, -10), Quaternion.identity);
g_o1.name="1";
然後在選選項時,也就是after_click的OnMouseOver()內
game_main.a = int.Parse(this.name);
//Debug.Log(this.name);
簡單來說就是用this.name就可以知道是哪個選項被點