顯示具有 Unity 標籤的文章。 顯示所有文章
顯示具有 Unity 標籤的文章。 顯示所有文章
, ,

【Unity】Timeout while trying to pause the Unity Engine 真的只是猜測


這個BUG其實也不知道從何說起,這篇是默認看的人已經知道android java 那些知識了,細節就不加以詳述了,因為大多都是以自己的理解去解釋,沒追證過,如果理解有誤還麻煩告知我XD

BUG點 : Timeout while trying to pause the Unity Engine


引發這個的可能性有很多,這裡只談到我遇到的這一種

當視窗沒有失焦,然後你可能使用了任何一個改變視窗的function((像是投影到電腦)),在這之後,如果單純觸發了activity的onPause方法沒有讓onWindowChangeFocus一起被觸發的話,在onResume的時候,unity就會當掉了,這時候如果又要onPause Unity的話就會出現

Timeout while trying to pause the Unity Engine. 




這裡是我解這bug幾天的心得,可能跟事實不一定完全相同,知識點可能也有誤,可以看看就好。

Unity內有許多系統的function ,其中有個 OnApplicationPause 跟 onApplicationfocus

官方連結:


OnApplicationFocus他是在UnityPlayerActivity內的 onWindowChangeFocus上觸發的,((如果我沒記錯的話)),然後OnApplicationPause也是UnityPlayerActivity內的 onPause 去觸發的

其中onWindowChangeFocus這個很重要,他是在渲染完成的時候調用的

當現在你的螢幕視窗被改變了,像是miracast到電腦,如果你沒觸發mUnityPlayer.windowChangeFocus讓unity去改變底層的東西,就直接pause他並resume的話就會出現問題,所以在pause之前(或之後?) 必須call [mUnityPlayer.windowChangeFocus ] ((這裡是嚴重的猜測,很不一定是真的))




Share:
Read More

【Unity】製作AndroidPlugin的重點與可能遇到的坑



有時候使用unity的時候會想要更改或使用到android內建的東西,像是android的鍵盤、android的通知欄(Toast)
這個時候單單使用unity能做到的事是有限的,所以必須使用android的plugin才能解決這類的問題


PluginsForAndroid 官方這邊就可以看到了
https://docs.unity3d.com/Manual/PluginsForAndroid.html

android plugin 的兩種格式


一個是用jar檔一個是aar檔,兩個都可以在unity內使用

兩者區別是:
jar檔只包含純code的模式,以下示意圖,每個jar檔可能都不一樣,當然還包含一些目錄的文件夾









aar檔則是有包含布局阿、圖檔阿...等這個plugin用到的資源,看起來像這樣







Unity官方則是推薦使用aar來當作plugin使用


製作android plugin的文章已經很多了,這邊講一下比較重要跟比較容易遇坑的幾點


導入classes (UNITY內的)


unity有提供一個jar檔作為android 與 unity的橋樑,
大致路徑是C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes

ps.如果最後輸出的是aar檔,最後要將aar檔內的libs/classes.jar刪除,以免與unity重複打包

app資料夾內build.gradle內


1. apply plugin: 'com.android.application'改成apply plugin: 'com.android.library' //因為是要當成plugin使用,所以要將application改成library,不然會輸出成apk

2. applicationId "com.xx.xxxxx" //這一行刪除

3. dependencies內新增compile files('libs/classes.jar')  //後面這個路徑是unity plugin接入的路徑跟檔名

4. minSdkVersion 21 對應到 unity BuildSetting內的MinimumAPI  LEVEL (下面有)

AndroidManifest


這個是一個xml檔案,用來指向unity連接android的入口與一些app屬性的操作,像是
裡面比較重要的是packgeName ,unity BuildSetting內的packgeName要跟AndroidManifest內的packgeName一樣,minSdkVersion 也必須跟BuildSetting內MinimumAPI Level一樣 (見下圖)







<meta-data android:name="unityplayer.UnityActivity" android:value="true"/>

放在</intent-filter>下面 </activity>上面

完整版:


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.u2a.testconnect" >


  <application
     
      android:label="@string/app_name"  // 如果你打沒這行,你在unity build出來的app名字會跟你在productName設定的不相符
      android:theme="@android:style/Theme.NoTitleBar">
    <activity android:name="com.u2a.testconnect.MainActivity">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
      <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
    </activity>

  </application>

</manifest>

如果製作jar檔,可能會遇到的坑

上面一經贅述了很多,至於怎麼製作jar檔,參考連結應該會有,筆者爬了很多製作jar檔的方式,發現有個小坑,會讓你按export jar之後,資料夾與jar檔都沒出現在目錄上






















對,就是gradle的版本,默認情況下會使用2.3.3版本,可是這樣照著網路上的資料來做的話,並不會出現想要的jar檔,我是改成2.2.3之後重build一次才出現jar檔的。




Extra: ((由於不多,所以不想多占一篇))

接上unity的plugin後,通常都會在MainActivity繼承UnityPlayerActivity (( 當然其他的Activity也可以,但是記得AndroidMainfest上的入口要修改為你用UnityPlayerActivity的那個 )),那這時已經建立連接口了,創建其他Activity的時候就不用再import UnityPlayerActivity了,除非有特殊需求,而如果要在unity內讀取其他Activity的話,則只需要使用AndroidJavaClass來指定讀取的路徑就可以了,像是我的packgeName為com.u2a.testconnect,第二個Activity 叫做SecondActivity,裡面有個靜態方GetSecondActivityNumber,回傳一個int,則會寫成這樣

Code:

  public Text log;
    int secondActivityNum = 0;

    private void OnGUI()
    {
      

        if (GUI.Button(new Rect(50, 500, 200, 100), "呼叫 SecondActivity的GetNumber"))
        {
           
            using ( AndroidJavaClass unity = new AndroidJavaClass("com.u2a.testconnect.SecondActivity")) //找出packge內的SecondActivity類別
            {
                secondActivityNum =   unity.CallStatic<int>("GetSecondActivityNumber");
                ShowSecondActivityNum();
            }

        }
        
    }

    public void ShowSecondActivityNum()
    {
        log.text = "顯示的數字(預設0) :"+secondActivityNum;
    }



關於 UnityPlayer.UnitySendMessage 看一下文件使用方法就知道了,這邊就不再多說。


成品:GOOGLE雲端


如果上述文章有任何疑問或錯誤理解,請不用懷疑的留言告知我,感謝。


參考資料與延伸閱讀:

Android Activity與 UnityPlayer Activity
http://eppz.eu/blog/unity-android-plugin-tutorial-1/


Android和Unity混合开发——Activity和Unity脚本交互和信息传递
http://www.jianshu.com/p/a7d82b3ac0c4

Android studio中如何生成引用 .aar 和 .jar
http://www.jianshu.com/p/76559da9ab39


Android Studio导出并使用aar和jar
http://chiahaolu.github.io/2016/06/27/Android-Studio%E5%AF%BC%E5%87%BA%E5%B9%B6%E4%BD%BF%E7%94%A8aar%E5%92%8Cjar/


Android Studio 打包及引用 aar
http://www.androidchina.net/2467.html






Share:
Read More
,

【Unity】xml文件讀取

之前做了一個用csv存取對話讀檔的系統,但是最近要用到大量的事件表

發現用csv會一大堆空格,不夠彈性,所以又跑回去以前不怎麼喜歡的xml格式

一開始想說xml好麻煩還要學,才跑去用csv比較直覺的

結果最近幾天看才發現,嗯?! 完全不會到入門其實蠻短的

保存用:
http://stanleyhlng.com/prettify-js/

https://rawgit.com/
========

<?xml version="1.0" encoding="utf-8"?>  
<DailyEvent>
    <Day id="1">
        <Event>
            event1
        </Event>
        <Dialog>
            "第一天"
        </Dialog>

    </Day>
    <Day id="2">
        <Event>
            event2
        </Event>
        <Dialog>
            "第二天"
        </Dialog>
    </Day>
</DailyEvent>

撰寫xml有幾個重點

1.宣告
<?xml version="1.0" encoding="utf-8"?>  
通常出現在XML文件的第一行,可寫可不寫
如果宣告了,version是必要寫上去的,然後後面的encoding則是選填
宣告了之後就可識別使用哪個編碼來代表文件中的字元了
像是
<?xml version="1.0" encoding="Shift-JIS"?>
就是使用日文編碼

2.先進後出
格式很像html那樣的寫法
基本上就是< >跟</ > 成雙成對出現
並且回文,意思就是先進後出,先寫的< >,最後再用</ >把它封起來
像上面的<DailyEvent> 一開始就寫了,如果裡面還要用別的<>就先擱著,如果沒有其他要寫的標籤,就可以封起來了
用文字表達就是 <1> <2> </2></1> 的感覺


3.樹狀結構
就跟樹一樣,只會有一個Root(父節點),指的就是上面範例的DailyEvent
不會有其他的Root了,然後再用這個Root去往下延伸
上面範例的第一個子節點是
<Day id="1">
同階層的另外一個子節點就是
<Day id="2">
而這兩個子節點又分別有兩個子節點

那資料就是可以儲存在某個節點的 <> 與 </> 中間那段空白,就像上面寫的第一天,第二天那樣

4.屬性
<>內可以填屬性,像是上面
<Day id="1">
內的 id="1",就是他的屬性,在unity內等等會用到


====

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Xml.Linq;
using System;
public class ReadXML : MonoBehaviour {
    public string id;
    public string eventContent;
    public string DialogContent;
    
    void Start () {

        var AllDays = XDocument.Load("Assets/DailyEvent_1.xml").Element("DailyEvent").Elements("Day");

        foreach (var day in AllDays)
        {
            id            = day.Attribute("id").Value.Trim();// 屬性
            eventContent  = day.Element("Event").Value.Trim();  // 內容                      
            DialogContent = day.Element("Dialog").Value.Trim(); //也是內容

            Debug.Log("day ID = " + id);
            Debug.Log("eventContent" + eventContent);
            Debug.Log("DialogContent" + DialogContent);
          
        }
    }
    
}

在Unity要讀取到xml檔案有兩種方法

一種是以前的XmlDocument
因為我用的不是這種的,所以這邊就先跳過了
有興趣的參考以下網頁

XML的簡單讀取與寫入

XML檔案基本操作-XmlDocument

第二種是比較新的XDocuments
可以用比較直覺地去讀取xml中的資料

要使用前先加入標頭檔
using System.Xml.Linq;

接下來就是開起xml檔了
先把輸入好的xml丟到unity內的Asset資料夾裡面,我是直接丟外面,當然也可以創建資料夾放到裡面,以下示範直接丟在外面的方式
XDocument AllDays = XDocument.Load("Assets/DailyEvent_1.xml");

那讀取完之後就是拿取裡面資料了
首先要先獲得它的節點
獲取節點有兩種方法
一種是你有很多個節點,使用的就是
根節點.Elements("XXXX");
另外一種就是只有單一節點
根節點.Element("XXXX");
基本上兩種方法就可以獲取到不同深度的節點了

拿取節點後要獲取內容的話就在後面.value就能拿到<與>之間的值了


拿取根節點的時候有比較步驟的方法,以下兩行都是相等的
 var AllDays = XDocument.Load("Assets/DailyEvent_1.xml").Element("DailyEvent");
 var AllDays = XDocument.Load("Assets/DailyEvent_1.xml").Root;

然後還有讀取節點的屬性
day.Attribute("id").Value

然後大致上就可以使用啦~ 還蠻直覺的
晚點放git



Share:
Read More

【Unity】使用動畫曲線 — AnimationCruve


有使用過Unity動畫狀態機的想必會覺得可以隨意新增Key來調整曲線這些功能很方便
那如果有天我只是想簡單做個事,像是把一張圖片放大,我個人會比較想能少一點東西就少一點東西,因此就可以使用到 AnimationCruve ,跟動畫機一樣可以調整曲線的類別。

關於AnimationCruve 在官方文檔中有詳細說明
https://docs.unity3d.com/ScriptReference/AnimationCurve.html

使用的時候就直接在腳本內宣告AnimationCruve

public AnimationCurve Curve;

在script外看來是這樣





夠簡單吧! 點開就能跟Animator一樣的使用了
點進去後可以操作keyframe,對某個keyframe點右鍵->editKey...可以設定他的值如下圖



















仔細看會看到上面的value跟time分別是旁邊的y軸跟x軸可以手動輸入比較精準

那要取出這些值呢,就是使用一個Evaluate方法(官方文檔),該方法就是丟入一個(time),他會返回一個(value)

那如果你要讓他像個動畫,想當然就是放在update裡面啦,不然你放在Start裡只會執行一次,也就是只拿到一個對應值而已
.
.
.
在這裡使用IEnumerator是因為我不想把放在Update裡面,然後又要每次停留1偵,不然while迴圈執行太快導致你看不清楚他有沒有變化

IEnumerator PlayAnimation()
    {

        float curveTime = 0f; 
        float curveAmount = Curve.Evaluate (curveTime);

        while (curveAmount<1.0f) {
        
            curveTime +=Time.deltaTime * Speed;
            curveAmount = Curve.Evaluate (curveTime);

            transform.localScale = new Vector3(curveAmount,curveAmount,curveAmount); //這裡我是把本身物件大小縮放

            yield return null;
        }
    }

先定義一個curveTime 將他當作曲線的time值(就上面講過的X軸的值)傳入
並且將curveTime隨時間增加,然後speed是我想比較方便控制他的速度才乘上去的
curveAmount = Curve.Evaluate (curveTime);這句就是把curveTime去查出對應的value是多少
之後就可以使用curveAmount來做動畫了,你可以改變物體大小...等很多事情
最後當然要等待下一偵啦,不然太快會看不到阿~

完整程式碼:

using UnityEngine;
using System.Collections;

public class WaveControl : MonoBehaviour {

    public AnimationCurve Curve;
    public float Speed;

    void Start () {
        StartCoroutine ("PlayAnimation");

    }

    IEnumerator PlayAnimation()
    {

        float curveTime = 0f;
        float curveAmount = Curve.Evaluate (curveTime);

        while (curveAmount<1.0f) {
        
            curveTime +=Time.deltaTime * Speed;
            curveAmount = Curve.Evaluate (curveTime);

            transform.localScale = new Vector3(curveAmount,curveAmount,curveAmount);

            yield return null;
        }
    }
}

====
16/10/5更:
忘記IEnumerator不能同時播放了XD
最後還是用回Update裡去了QQ
Share:
Read More

【UGUI】不規則圖片觸發範圍修改

NGUI有boxcollider可以自己調整觸發的範圍
但UGUI由於不是用boxcollider來觸發的,所以要修改也要有另外個方法

基本上用雨松的方法就行了-->連結在此

但找到另外一種方法,可以少寫比較多的代碼,但比較不靈活(?,沒辦法自己控制想要的範圍

首先有這麼一張圖,做成UGUI的按鈕的話,透明的地方也會被觸發到

而今天我想消除透明的地方,只有有顏色的地方才能觸發


先把匯入的圖檔先調一下,調成可讀可寫的


然後+入一個腳本
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class UGUI_Button_alpha : MonoBehaviour {

    public Image image;
    public float threshold = 0.5f;
    
    void Start () {
        image.eventAlphaThreshold = threshold;
    }
    
}

原理其實Unity API裡面寫得很清楚了

讀取Image的eventAlphaThreshold值,來判斷圖片的Alpha值(所以要把圖片設定為可讀可寫)

1的話就是總是會通過,調低就會忽略透明度,所以到最後點擊圖片才會響應。

Image就放你想套用的那張圖片,然後再調一下threshold 到你滿意的值就好

Share:
Read More

[Unity] NGUI與UGUI分別如何攔截事件


由於常常會發生點擊了介面,遊戲內的物件也會被觸發的關係
所以會用到攔截事件,而NGUI的方面比較簡單,只要添加

if (UICamera.isOverUI)
    return;

當我們在射線檢測的時候,如果點擊到UI就不會發生反應了


UGUI方面的話則是

#if IPHONE || ANDROID
            if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
            return;
#else
            if (EventSystem.current.IsPointerOverGameObject())
                return;
#endif

由於要判斷平台,所以比較長
下面那句則是PC使用的
Share:
Read More

[Unity]【筆記】Loading讀取畫面,百分比緩動

momo的文章

其實momo寫的就非常清楚了

基本上大家都會異步加載的方式來實現loading畫面
畢竟遊戲大了,只用loadlevel會lag 卡卡的

要了解異步,要先了解AsyncOperation類別

有四個Variables

目前要用到的只有兩個

allowSceneActivation和progress

progress的取值在0.1~1之間,不會等於1
為了計算百分比,以下會x100來計算

一般來說,我們都是 A場景到C場景,中間會有個B場景當LOADING畫面

而通常我們載入一些資源較少的場景,loading會很快,這樣你可能連影都沒看到就跳到下個場景了

所以allowSceneActivation 就是用來加載完成後,什麼時候你才要讓他跑下個場景
設為false的話就是永遠不跳到下個場景,直到true才會

======================


async.allowSceneActivation = false;
       
        while (async.progress < 0.9f)
        {
            toProgress = (int)async.progress * 100;
            while (displayProgress < toProgress)
            {
                ++displayProgress;
                SetLoadingSlider(displayProgress);
                yield return new WaitForEndOfFrame();
            }
            yield return new WaitForEndOfFrame();
        }
        toProgress = 100;
        while (displayProgress < toProgress)
        {
            ++displayProgress;
            SetLoadingSlider(displayProgress);
            yield return new WaitForEndOfFrame();
        }


基本上跟momo那篇一樣,不過IEnumerator loadScene()內在加入上面代碼
async.allowSceneActivation = false; 就是加載完之後不允許直接跳下個畫面

async.progress

讀取進度通常會小於0.9的時候就跳畫面了,因此用兩個while迴圈
一個是在0.9前,一個是在0.9後,也就是讀取完場景前跟讀取完場景後

1.第一個while迴圈,還沒讀取完
當displayProgress小於當前讀取進度的百分比
就++,然後利用 SetLoadingSlider ,返回畫面的進度條讓他緩動 (( 就是1~90,每次跳躍都可以看到1.2.3.4這樣跳,才不會一開始10% 數字立馬跳到90%

2.第二個while迴圈,讀取完後

因為async.progress不會等於1,也就是 toProgress 不會讀取到100% ((詳細讀第一個迴圈

手動的把toProgress設為100 後進入第二個迴圈
接著跟上面一樣,就完成啦~


完整代碼  :
(感謝 [鴿子獸] 葷教授 的修正 )

using UnityEngine;
using System.Collections;
using UnityEngine.UI;


public class Loading : MonoBehaviour
{



    AsyncOperation async;
    int Progress
    {
        get { return _progress; }
        set {
            _progress = value;
            if(_progress>=100) { async.allowSceneActivation = true; }
        }
    }
    int _progress = 0;
    public Slider LoadingSlider;


    void Start()
    {
        StartCoroutine(loadScene());
    }

    IEnumerator loadScene()
    {
        int Progress = 0;
        int toProgress = 0;
        async = Application.LoadLevelAsync(Globe.loadName);
        async.allowSceneActivation = false;

        while (async.progress < 0.9f)
        {
            toProgress = (int)async.progress * 100;
            while (Progress < toProgress)
            {
                ++Progress;
                SetLoadingSlider(Progress);
                yield return new WaitForEndOfFrame();
            }
            yield return new WaitForEndOfFrame();
        }
        toProgress = 100;
        while (Progress < toProgress)
        {
            ++Progress;
            SetLoadingSlider(Progress);
            yield return new WaitForEndOfFrame();
        }

    }

    void SetLoadingSlider(int p_progress)
    {
        float tmp = (float)((float)p_progress / 100);
        LoadingSlider.value = tmp;
    }
}
Share:
Read More

[Unity]【筆記】創建自己的有限狀態機



________________________________________________________


有限狀態機,大概大家都聽過吧,沒聽過的

這裡請

不過基本上都是用到的時候學啦,以前有看了幾天,發現我的智力不足,先放棄

但最近專題要開始使用,所以...火坑我來了

看完中文,建議研究一下英文的,下面有實作

這裡

本篇是根據英文的實作改了一下做出來的筆記,說是筆記,因為是雛形,然後又不知道哪邊觀念可能錯誤,請多多指教一下XD

_________________________________________________________

研究了這麼久,我認為實作有限狀態機,最重要的概念是

繼承,抽象

整個看起來是這樣,完成之後才要在創建個AIController去使用它





首先先創建個基類BaseState,此類別為抽象類別

繼承他的實作他的DoSomething(Gameobject npc)方法,這個抽象方法
很重要,因為所有繼承他的類別都有這個方法,至於為何,等到用到會再說明


接下來,開始創建使用它的機器,((先不用創建它有哪些狀態))

這個類也是不用繼承MonoBehavior,因為真正要用狀態機的不是這個類

首先,狀態"機",的機,肯定是集合很多狀態而成的,因此宣告一個List把所有狀態都

裝在一起,再宣告當前狀態 currentstate ,在建構子上為這個list創建空間,狀態機可能

會有,新增、查詢、刪除...等 ,因為只是筆記最簡單的怎麼用,因此用一個普通的新增

方法就好。



好,接下來可以想一下你要什麼狀態了,這裡先用A狀態跟B狀態來表示,創建每個狀態

然後繼承於BaseState類




B狀態也跟這上面一樣,我就不貼囉,然後選好狀態之後,差不多就完成了

接下來要創建個控制器,也就是最終你會貼到Unity的編輯室窗上的component,也可以說成AI


首先,在這個AI裡面,要先創建個狀態機,也就是剛剛集合所有State的 FSMMachine

接著把所有會用到的State宣告一下







接著宣告完之後,在Start方法中把它(狀態) 加入到創建的fsm中













fsm中,加入了a、b狀態,currentstate是目前狀態,因為一開始沒指定,所以在start方法也順變指定為a

接著再Update中,呼叫doSomthing方法,傳入gameobject







注意這邊 fsm.currentstate ,上面再Start方法中指定為a,因此目前做的是a的dosomthing方法

如果把fsm.currentstate = b的話,就會執行b的dosomthing方法,這裡就是精華所在了

換另外一個狀態,上一個狀態就不會再繼續執行,就像switch case做的狀態機一樣

而目前的Controller中,沒辦法轉換狀態,因此加入一個ToState方法






傳入一State,然後改變fsm的currentstate(當前狀態)

完整如下



























這個類就完成了,接著去每個狀態中實現他們的方法













如果按下滑鼠左鍵,則轉換到狀態b,因該不用多解釋了吧XD

接著把Controller掛到隨便一個物體上,運行就會像這樣








另外,Unity還有使用interface實現FSM的方法,個人比較喜歡那個,比較簡潔。



參考資料 : http://wiki.unity3d.com/index.php/Finite_State_Machine















Share:
Read More

[Unity] 使用PHP,更新MySql內Json資料

最近學了一下unity跟mysql結合,發現挺有用的

配合上json更好儲存數據

原本是把所有欄位轉成json數據傳送,但如果一堆要存的數據的話

使用的欄位,未免過多,因此找了找些資料,發現可以用TEXT欄位寫所有json數據

再傳到unity解析、更新,這樣就不必花費太多欄位了

unity跟mysql的關係,大概的關係是這樣

中間兩個是php腳本


一、創建資料庫
PS.用的是xampp


資料庫名稱為unitydatabase 
資料表名稱為UserData
兩個欄位 id , data
然後先新增一欄資料,id為1
data 裡面要打什麼都可以

二、創建php

其中UnityDatabase是你的數據庫名稱,root是你的帳戶名、root後面的是密碼
我是沒設,所以中間留白
第四行是連接數據庫
第六行sql語句select * form (你的資料表)

最後json_encode();是把剛剛選的資料表內的資料轉換成json格示輸出到網頁上
儲存好後 網頁網址就會是
http://127.0.0.1/DownloadDB.php //等等unity內會用到,要記好路徑



unitydata是自訂義的變數,後面那句 $_POST是跟unity連接的點
$_POST["xxxxx"]  xxxxx 是Unity內,表單要傳送的變數名,要記住
其他基本上都一樣,最後一句是更新目前資料庫內data欄位的數據,是用id=1去尋找的



三、創建unity腳本

 定義兩個path,用來更新資料庫和下載資料庫

再來創建兩個按鈕,個別執行兩個函數,下載和上傳
 定義想要儲存的資料


JsonSave方法是用來把所有儲存的資料轉換成json格式,日後用來上傳到資料庫

















定義之前兩個按鈕的方法



















downloadjson方法:
使用內建的WWW方法,開啟之前宣告好的path
拿到後,使用JsonMapper方法,將網頁內的json數據拿下來
由於拿下來的數據會包含所有欄位的資料,因此下面的
string jsc = json["Data"].ToString(); 是限定只獲取Data欄位內的資料
為了改變數據,再次將jsc轉換,然後將想要改的資料騰上去
這樣unity內的數據就轉換完成啦

updatajson方法:
宣告個WWWForm,第二行unitydata就是一開始updateDB.php那個post括弧內的String兩個一定要一樣,後面就是要傳入的資料,JsonSave上面有提及,就是所有資料打包成string
OK後,用WWW將form傳入,然後undateDB.php就會更新mysql的資料庫了

四、完成

DownloadDB看起來會是這樣






資料庫內長的像這樣










在unity面板內可以更新,但第一次使用由於Data裡面會是空的
所以下載下來的沒辦法使用,要先update一次才行。


Script內容是這樣




Share:
Read More