1. 程式人生 > >伺服器開發之Unity3d(C#)介面回撥

伺服器開發之Unity3d(C#)介面回撥

一、前言

一隻腳踏入伺服器開發的行列,一隻腳還在客戶端徘徊。在這個職業規劃亦或是人生規劃的三叉路口,未來是朝著客戶端發展,還是向服務端進發。現在是一個重要的選擇,也是一個全新的機會。這篇文章我把它分類到伺服器開發之列,也想把這篇文章列入我今後伺服器開發的第一篇。第一次總是感恩戴德的,第一次總是刻骨銘心的。
注意
1.在Unity3d中(以4.x為例)是使用.net framework 2.0的,這一點需要注意。
2.聯網操作是耗時操作,在這裡我選擇了使用Unity協程來完成聯網操作。
3.封裝SDK可以既可以加快客戶端開發也可以減少用來開會約定通訊欄位的時間。這篇文章是使用C#來封裝一個dll檔案供客戶端呼叫。
4.服務端使用php來開發。
5.依賴的dll檔案UnityEditor.dll

UnityEngine.dll可以在Unity根目錄\Editor\Data\Managed下找到

二、環境描述

OS:win7_x64
IDE:VS、Zend、Uinty3d
Other:xampp

三、專案準備

1.建立C# .net framework 2.0庫專案
2.建立Unity3d測試專案
3.建立php專案

四、服務端程式書寫

在tempController.class.php中寫一個方法用來接收客戶端程式的方法。客戶端用post傳過來一個name欄位和pass欄位。
我們的方法就可以寫成:

$name = I('post.name');
$pass = I('post.pass'
);

這兩行程式碼使用來接受客戶端的欄位內容。
有了欄位內容我就可以做需要的操作了

五、SDK程式(dll檔案)編寫

我們使用Unity3d自帶的聯網工具類來書寫。程式碼如下:
業務操作類

WWWForm form = new WWWFrom();
form.AddField("name","thisIsMyName");
form.AddField("pass","thisIsMyPass");
WWW www = new WWW(url,form);

通過上面的操作我們就能夠將客戶端的thisIsMyNamethisIsMyName資訊傳送到服務端了。
補充
通過以上操作可以將客戶端的資訊傳送到服務端,那麼怎麼判斷訊息傳送結束和接收服務端返回的Json資料呢?
Unity3d提供了一個很好的方法。在dll中判斷網路傳送訊息結束可以使用下面的方式(接上面的程式碼):

www.isDone();

這個方法會返回一個bool值,通過判斷bool值可以知道通訊是否已經結束了。本篇文章講的是介面回掉,到現在也沒有講到回掉的要點,各位看官是否有點安奈不住自己的耐心了呢?且容我在賣給關子。
上面我們說道,在聯網操作中要使用協程。在網路通訊時,就是協程發揮作用的時候。下面給出協程的使用方法:

while (!www.isDone()) {
        yeild return new WaitForSeconds(0.5f);
}

這段程式碼是允許在通訊過程中彈出使用者等待狀態的進度條的關鍵所在。
通訊完成後,如何解析服務端的Json資料呢?
Unity3d只提供了,接收資料,沒有提供很好的Json資料解析的工具類,或者說我沒有找到。在此推薦使用Newtonsoft.Json,我最初使用的是MiniJson由於使用的是別人封裝的dll在apk打包的時候不能通過編譯,這才轉而使用Newtonsoft.Json。關於Newtonsoft.Json在此不再贅述。
下面給出Unity3d接收伺服器返回資料的方法(接上面的程式碼):

www.text();

這個會將服務端的Json資料接收下來。接收之後,可以是Newtonsoft.Json進行進一步解析。

六、介面回撥

通過上面的操作我們的客戶端可以通過dll檔案向服務端傳送請求並能夠順利接收訊息。在實際生產過程中可能因為這樣或那樣的原因我們不能在dll中寫完所有的操作,需要客戶端的配合。這就誕生介面回撥。介面回撥可以讓我們的庫檔案與客戶端程式碼進行互動。介面回撥中我們使用C#的委託(delegate)機制。通過委託,可以將方法申明和方法體書寫分離開來。下面開始關鍵的程式碼演示,dll中程式碼如下:
方法申明

public void deleget Success();

dll庫檔案回撥客戶端方法體

public static IEnumerator login(String name,String pass,Success success) {
        String url = "http://ServerIP/模組/控制器/方法";

        WWWForm form = new WWWFrom();
        form.AddField("name","thisIsMyName");
        form.AddField("pass","thisIsMyPass");
        WWW www = new WWW(url,form);

        while(!www.isDone()) {
                yeild return new WaitForSeconds(0.5f);
        }

        //Json資料解析(略)可以使用結束語中的郵箱聯絡我。

        if(登陸成功) {
                success();//呼叫客戶端程式碼
        }
}

客戶端方法體編寫(供dll呼叫)
假設namespacecom.oneym,類名是Utlis

Utils.login("thisIsMyName","thisIsMyPass",delegate(){
            Debug.Log("這裡是成功後的操作。");
});

通過以上的操作我就可以在dll中完成介面回調了。

七、結束語

如果對文章有疑問可以通過郵箱[email protected]與我一起探討。
也可以加入QQ群137163838,開源我們的思維,點亮整個世界!

相關推薦

伺服器開發Unity3dC#介面

一、前言 一隻腳踏入伺服器開發的行列,一隻腳還在客戶端徘徊。在這個職業規劃亦或是人生規劃的三叉路口,未來是朝著客戶端發展,還是向服務端進發。現在是一個重要的選擇,也是一個全新的機會。這篇文章我把它分類到伺服器開發之列,也想把這篇文章列入我今後伺服器開發的第

伺服器開發Unity3dC#圖片上傳下載

一、前言 遊戲中圖片的上傳下載是一個亙古不變的話題,這次在開發遊戲伺服器的過程中也不可避免的出現了圖片下載和上傳的問題。遇到了PNG圖片下載完成後透明的部分變成黑色、圖片上傳附帶驗證資訊、下載後文件不一樣的問題。 二、問題回顧 伺服器上面儲存了

Android開發計算器介面設計activity_main佈局檔案

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schem

Android開發計算器介面設計

        計算器開發主要涉及到LinearLayout佈局、EditText、Button的使用。為android入門基礎內容。 開啟android studio選擇建立一個新的工程,應用程式的名稱為CalculateApp,公司域可以設定,也可以不設定,我設定的如圖所示 點選“next”,選擇支援的最

Aery的UE4 C++遊戲開發5字元&字串

[toc] # TCHAR 字元 --- C++支援兩種字符集:即常見的ANSI編碼和寬字元的Unicode編碼,實際對應的字元型別分別是char和wchar_t,在不同平臺環境下,我們可能需要不同的字元型別。 TCHAR就是UE4通過對char和wchar_t的封裝,將其中的操作進行

iOS多線程開發GCD下篇

num 不能 每次 自定義 left void 類型 c函數 current 上篇和中篇講解了什麽是GCD,如何使用GCD,這篇文章將講解使用GCD中將遇到的死鎖問題。有興趣的朋友可以回顧《iOS多線程開發之GCD(上篇)》和《iOS多線程開發之GCD(中篇)》。

C/C++知識回爐 全棧c

hello printf 無敵 特殊 導致 span height world! 指向 c語言講義 指針的重要性,有人說學c語言,沒有學過指針就相當於沒有學過c語言,而我很不幸,大學時代就是,學了c語言,但是沒有學指針 1 //c語言中函數要先聲明 後使用 我們要

Android 開發 ---- bootloader LK

ttl tab 不同的 opera 指定 isa system void mem LK是什麽 LK 是 Little Kernel 它是 appsbl (Applications ARM Boot Loader)流程代碼 ,little kernel

ONVIF學習-ONVIF開發框架搭建C++

nts red port ice 框架搭建 代碼 nal tails 服務器 第一步、下載gsoap 從gsoap官網(http://www.genivia.com/products.html#notice)下載最新版gsoap(博主用的是gsoap_2.8.45

前端基於react,後端基於.net core2.0的開發1 介紹

tco ioc logs asp webpack 路由 src 部署 關鍵字 文章提綱目錄 1.前端基於react,後端基於.net core2.0的開發之路(1) 介紹 2.前端基於react,後端基於.net core2.0的開發之路(2) 開發環境的配置,

4.前端基於react,後端基於.net core2.0的開發4 前端打包,編譯,路由,模型,服務

hub 解決 路徑 export routes run 部署 service 後端 1.簡要的介紹 學習react,首先學習的就是javascript,然後ES6,接著是jsx,通常來說如果有javascript的基礎,上手非常快,但是真正要搭建一個前端工程化項目,還是有很

android開發Animation

protected html err nim package 設置圖 move 函數 star android開發之Animation的使用(五) 本博文主要講述的

python開發

數字 美團 其中 class 翻譯 電視 ... 硬件 算數運算 一、python基礎入門 1、編程語言 程序員與計算機溝通的語言就叫做編程語言 編程語言發展至今經歷了以下: ①.機器語言:站在計算機(奴隸)的角度,說計算機能聽懂的語言,那就是直接用二進制編程,直接操作

微信小程序後端開發總結~1C#

ali 存在 漢字轉換 返回 font con utf8 OS big 1.小程序端對於18位long類型的接收轉換會出錯,比如171106161246602821—> 171106161246602820。 例如:用戶表的主鍵id存的是18位的biglong類型的,

iOS開發runtime:runtime除錯環境搭建

本系列部落格是本人的原始碼閱讀筆記,如果有iOS開發者在看runtime的,歡迎大家多多交流。為了方便討論,本人新建了一個微信群(iOS技術討論群),想要加入的,請新增本人微信:zhujinhui207407,【加我前請備註:ios 】,本人部落格http://www.kyson.cn 也在不停的更新中,歡迎

【轉載】iPhone開發NSNotificationCenter通知的使用方法

iPhone軟體開發的時候會遇到這種情況:開啟APP後會在後臺執行某個方法,例如下載檔案,下載完成後可能需要呼叫某個方法來重新整理介面,這時候可能沒法在下載的函式中回撥。NSNotificationCenter(通知)是一個很好的選擇。 通知使用起來灰常的簡單: 1、定義通知:[[NSNotifica

iPhone開發NSNotificationCenter通知的使用方法

iPhone軟體開發的時候會遇到這種情況:開啟APP後會在後臺執行某個方法,例如下載檔案,下載完成後可能需要呼叫某個方法來重新整理介面,這時候可能沒法在下載的函式中回撥。NSNotificationCenter(通知)是一個很好的選擇。 通知使用起來灰常的簡單: 1

Android牟利--介面嵌入有米廣告

經過了一番折騰,忙忙碌碌了一下午,終於搞明白了Android軟體介面嵌入廣告的方法,以下我以嵌入有米廣告為例小結一下: 步驟一,下載有米廣告SDK,將 youmi-android.jar 匯入想要嵌

從零開始學 Web Ajax介面文件,驗證使用者名稱唯一性案例

>大家好,這裡是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... > > - github:https://github.com/Daotin/Web > - 微信公眾號:[Web前端之巔](https://github.com/Daotin/pi

[Java開發路]8輸入流和輸出流

1. Java流的分類 按流向分: 輸入流: 可以從其中讀入一個位元組序列的物件稱作輸入流。 輸出流: 可以向其中寫入一個位元組序列的物件稱作輸出流。 這些位元組序列的來源地和目的地可以是檔案,而且通常都是檔案,但是也可以是網路連線,甚至是記憶體塊。抽象類Input