1_Unity學習筆記,就讓我們先來說說MonoBehaviour吧!

是的,我這邊並不會告訴各位怎麼安裝Unity請自己上網爬文,這裡從C#開始出發告訴各位如何使用Unity。 請把在下我當作業餘的來看看吧,這裡只會記下我的經驗。 Awake() Start() Update() FixedUpdate() LateUpdate() 通常會看到以上這種東東,來來來來,這是甚麼呢? 關於流程圖的部分就請各位自由爬文,在下可以算是個懶人哈哈! 總之在這邊稍微介紹一下,一般來說看起來會像是:  Awake()     ↓    Start()     ↓ FixedUpdate()←←     ↓      ↑  Update()   ↑     ↓      ↑  LateUpdate()→→↑ 的流程,每個場景開始,會先執行每個物件身上的Awake(),接著執行每個物件身上的Start() 都執行完後將會迴圈所有物件依照如上圖的順序。 FixedUpdate最重要的是他每次間隔都是絕對的,在Edit > Project Settings > Time 可以找到 Update則是針對每一禎都會執行,因為禎數會隨著遊戲效能而有所不同,因此Update的間隔都不一定,可以利用Time.deltaTime取得每一禎的時候再秒數的比例。 LateUpdate就跟Update一樣,不過會觸發在Update後面。 另外介紹一些我個人比較常用到的: OnApplicationFocus 當遊戲被縮小或失去焦點的時候會觸發 OnApplicationPause 當遊戲被暫停的時候,電話來了之類的 OnApplicationQuit 當玩家離開遊戲前會先觸發此才關閉程式 OnCollisionEnter 當碰撞到的時候 OnCollisionEnter2D 同上,2D時使用,忽略Z軸 OnCollisionExit 當碰撞體離開時 OnCollisionExit2D 同上,2D時使用,忽略Z軸 OnCollisionStay 當碰...

Unity儲存以及讀取

在Unity中,有很多種讀取及儲存的方式,在此我會稍微介紹我有碰過的方法,如果有方法我沒介紹到,基本上就是我沒碰過的沒甚麼好意外哈哈!


『 Editor only,只能使用在編輯器的 』


【Prefab & Unity.Object】
儲存預製物(Prefab):
PrefabUtility.CreatePrefab("Assets/prefab/" + prefabName + ".prefab", MyPrefab); //儲存預置物到外部

儲存Unity.Object,Sprite,Material,自定義的Asset:
AssetDatabase.CreateAsset(MyAsset, string.Format("Assets/{0}.asset", MyAssetName));


不論prefab還是Asset都可以使用此讀取:
(GameObject)AssetDatabase.LoadAssetAtPath(string.Format("Assets/{0}.prefab", MyPrefab), typeof(GameObject));
GameObject換成要讀取的東西,例Texture2D、TextAsset等。


『 一般狀況皆可使用 』


【PlayerPrefs】
儲存一般資料,利用Unity本身提供的儲存方式PlayerPrefs:
macOS是儲存在 ~/Library/Preferences資料夾中,名為unity.[company name].[product name].plist的檔案。
Windows是儲存在Regedit裡的HKCU\Software\[company name]\[product name]裡面的Key&Value。
在Editor上跑的話,有可能會儲存在HKCU\Software\Unity\UnityEditor\DefaultCompany\[product name]裡面

使用方式非常簡單:
PlayerPrefs.SetFloat("key",Value); //Value 為 Float
PlayerPrefs.SetInt("Key",Value); //Value 為 Int
PlayerPrefs.SetString("Key",Value); //Value 為 String

讀取方式也非常簡單:
variable = PlayerPrefs.GetFloat("key",Default); //variable 為 Float
variable = PlayerPrefs.GetInt("Key",Default); //variable 為 Int
variable = PlayerPrefs.GetString("Key",Default); //variable 為 String
可設定如果沒取到東西時的預設值Default。


【JsonFile】
儲存myclass內物件:
MyClass myclass = new MyClass();
myclass.A = 0;
myclass.B = "string";
string saveString = JsonUtility.ToJson(myclass);
StreamWriter file = new StreamWriter(path + "file.json");
file.Write(saveString);
file.Close();
宣告一個MyClass的物件,調整個裡面儲存的數值,接著使用JsonUtility的ToJson,就會簡易的轉換成字串方便儲存。
記得在需要儲存的Class上面指定是可以序列化的Class,[System.Serializable];

讀取myclass內物件:
StreamReader file = new StreamReader(path + "file.json");
string loadJson = file.ReadToEnd();
file.Close();
MyClass myclass = JsonUtility.FromJson<MyClass>(loadJson);
讀取檔案後,將原字串轉換回Json檔,接著再用MyClass去接受這個檔案即可。


【Prefab & Unity.Object】
儲存Unity.Object,以Texture2D為範例:
using (FileStream fs = File.Open(savePath, FileMode.Create)) //寫出檔案
{
    byte[] b = Texture2D.bytes;
    fs.Write(b, 0, b.Length);
}
基本上遊戲運行時是不太能夠儲存Unity.Object的,目前用的辦法比較偷吃步,大概就是把檔案轉成bytes然後輸出到外部。
目前我的認知是,在遊戲運行中,無法儲存/覆蓋Unity.Object,只能頂多用以上方法把檔案作為bytes處理。

讀取Unity.Object:
(GameObject)Resources.Load("MyGameObject");
或寫成:
Resources.Load<GameObject>("MyGameObject");
或:
(GameObject)Resources.Load("MyGameObject",typeof(GameObject));

請注意,以上是沒有附檔名的,在Resources裡面會直接導向到專案內的Assets底下的Resources資料夾,也就是:
"UnityProject/Assets/Resources/",而檔案名稱也不用輸入副檔名,附檔名會依照所指定的類型(在此指GameObject)去尋找檔案(附檔名)
遊戲物件(預製物),GameObject,.prefab
圖片,Texture2D,.psd.jpg.png.gif.bmp.tga.tiff.iff.pict.dds
文字檔,TextAsset,.txt.htm.html.xml.bytes
音效,AudioClip,.mp3.ogg.aiff.wav.mod.it.sm3
材質球,Material,.mat
影片片段,MovieTexture,.mov.avi.asf.mpg.mpeg.mp4
P.S.Shader的話無法使用Resources.Load,請改用Shader.Find("MyShader");


備註:
有時候我會需要寫出Debug.Log的訊息,這時候就會用:
using (StreamWriter sw = new StreamWriter(Application.persistentDataPath + "/testResult.txt")) //寫出檔案
{
    sw.WriteLine("寫出訊息");
}
之類的,其目標地點則為"C:\Users\使用者名稱\AppData\LocalLow\公司名稱\遊戲名稱" 內。


以上為本篇筆記的全部內容,如果有任何一段對你有幫助,那就太好了!

留言

這個網誌中的熱門文章

EditorGUILayout學習筆記

1_Unity學習筆記,就讓我們先來說說MonoBehaviour吧!