unity3d向后台注册账号_unity3d 后台运行 - CSDN
  • 环境: Unity2017.3.0f3 Mysql5.7.20 Wampserver64 在Wampserver64 的www目录...1. unity3d通过get方式请求php 1、1Unity端的代码 using UnityEngine; using System.Collections; public class phpUnity1 : Mo

    环境:
    Unity2017.3.0f3
    Mysql5.7.20
    Wampserver64
    在Wampserver64 的www目录下新建名为unity的文件夹。

    1. unity3d通过get方式请求php

      1、1Unity端的代码
    
    using UnityEngine;
    using System.Collections;
    
    public class phpUnity1 : MonoBehaviour
    {
        private string url = "http://localhost/unity/phpunity1.php?id=1&cid=123456";  //带get参数id和cid的url
    
        void OnGUI()
        {
            if (GUILayout.Button("get php"))
            {
                StartCoroutine(OnGet());
            }
        }
    
        IEnumerator OnGet()
        {
            WWW www = new WWW(url);
    
            yield return www;
    
            if (www.error != null)
            {
                print("php请求错误: 代码为" + www.error);
            }
            else
            {
                print("php请求成功" + www.text);
            }
        }
    
    }
       1、2  php端代码(php名字为phpunity1.php)
    
    <?php  
        if(isset($_GET["id"])
            && isset($_GET["cid"]))
        {
            echo "get请求成功,id值为:".$_GET["id"].",cid值为:".$_GET["cid"];
        }
    ?>

    结果:
    这里写图片描述
    2. unity3d通过post方式请求php.

        2、1   Unity端的代码
    
    using UnityEngine;
    using System.Collections;
    
    public class phpUnity2: MonoBehaviour
    {
    
        private string url = "http://localhost/unity/phpunity2.php";  //
    
        void OnGUI()
        {
            if (GUILayout.Button("Post php"))
            {
                StartCoroutine(OnGet());
            }
        }
    
        IEnumerator OnGet()
        {
            //表单
            WWWForm form = new WWWForm();
            form.AddField("id", 1);
            form.AddField("cid", 123456);
    
            WWW www = new WWW(url, form);
    
            yield return www;
    
            if (www.error != null)
            {
                print("php请求错误: 代码为" + www.error);
            }
            else
            {
                print("php请求成功" + www.text);
            }
        }
    }
        2、2   php端代码(php名字为  phpunity2.php)
    
    <?php 
        if(isset($_POST["id"])
            && isset($_POST["cid"]))
        {
            echo "post请求成功,id值为:".$_POST["id"].",cid值为:".$_POST["cid"];
        }    
    ?>

    结果为:
    这里写图片描述

    3、unity3d和php后台通讯实例

        3、1 简单来个UI界面
    

    这里写图片描述

                3、2     Unity端的代码
    
    using UnityEngine;
    using UnityEngine.UI;
    using System.Collections;
    
    
    public class login : MonoBehaviour
    {
        public InputField userIdField;
        public InputField passwordField;
        public Text statusText;
    
    
        public Button loginBtn;
        private string userId = "";
        private string password = "";
        private string url = "http://localhost/unity/login.php";
    
        private void Awake()
        {
            loginBtn.onClick.AddListener(OnLogin);
        }
        public   void OnLogin()
        {
            userId = userIdField.text;
            password = passwordField.text;
    
            if (string.IsNullOrEmpty(userId)|| string.IsNullOrEmpty(password))
            {
                print("账户和密码不能为空");
    
                return;
            }
    
            StartCoroutine(logining());
        }
    
        private IEnumerator logining()
        {
            WWWForm form = new WWWForm();
    
            form.AddField("userId", userId);
            form.AddField("password", password); 
    
            WWW www = new WWW(url, form);
    
    
            yield return www;
    
            if (www.error != null)
            {
                print("error is login:" + www.error);
                statusText.text = www.error + "...";
            }
            else
            {
                print(www.text);
                statusText.text = www.text;
            }
    
        }
    
    }
        3、3   php端代码
    

    这里有两个,
    一个是php对数据库的操作代码 dbconfig.php,
    二是登录的代码 login.php

    dbconfig.php

    <?php
        /****************************************************************************
        *    说明: 对数据库的封装
         ****************************************************************************/
    
        class dbconfig{
    
            //构造函数
            function __construct()
            {
                 if(!$this->mysqli = mysqli_connect($this->host, $this->user, $this->pwd))
                {
                    die("Cant connect into database");        
                }
                else
                {
    
                         echo  "连接数据库成功...<br />";
                }
    
                $this->select_db($this->db_name);        
            }
    
            //析构函数
            function __destruct()
            {
                mysqli_close($this->mysqli);
            }
    
            /*
            *    说明:    
            */
            public function get_mysql_handle()
            {
                return $this->mysqli;
            }
    
            /*
            *    说明:    
            */        
            public function select_db($_db)
            {
                if($this->mysqli != null)
                {
                    if(mysqli_select_db($this->mysqli, $_db))
                    {
                         echo  "连接数据库成功...<br />";
                    }
                    else
                    {
                        die("Cant connect into database");
                    }
                }
            }        
    
            /*
            *    说明:    执行一个sql无返回值
            */
            public function execute($_sql)
            {
                if(empty($_sql))
                {
                    echo "参数不能为空";
                    return;
                }
    
                if(!mysqli_query($this->mysqli, $_sql)) 
                {
    
                      echo  "执行失败...<br />";
                }
            }
    
            /*
            *    说明: 执行一个查询语句,并执行回调函数
            */
            public function do_query($_sql, $query_callback = "")
            {
                if(empty($_sql))
                {
                   echo  "参数不能为空";
    
                    return;
                }
    
                if($result = mysqli_query($this->mysqli, $_sql)) 
                {
                    $num_rows = $result->num_rows;
                    if($num_rows > 0)
                    {
                         while($row = $result->fetch_assoc())
                        {
                            if(!empty($query_callback))
                            {
                                call_user_func( $query_callback , $row );
                            }
                        }
    
                        return $num_rows;
                    }
                    else
                    {
                        return 0;
                    }
    
                    mysqli_free_result($result);    
                }
                else
                {
                   echo  "执行失败...<br />";
                }
            }
    
    
            //成员变量
            private $host = "localhost";    //数据库地址
            private $user = "root";            //用户名
            private $pwd = "123456";                //用户密码
            private $db_name = "test";        //数据库
            private $mysqli = null;
        }
    ?>

    login.php

    <?php
        /****************************************************************************
        *    说明: 登录
         ****************************************************************************/
        include_once "dbconfig.php";
    
        $dbcfg = new dbconfig();
        $password_db = "";
    
        if(isset($_POST["userId"]) && isset($_POST["password"]))
        {
            $password = $_POST["password"];
    
            $sql = "select * from tb1 where userid='".$_POST['userId']."'";
            if($dbcfg->do_query($sql, "login_callback") > 0)
            {
                if($password_db == $password)
                {
    
                    echo "登录成功...".$_POST["userId"].",".$_POST["password"].",".$password_db;
                }
                else
                {
    
                     echo "登录失败1...".$_POST["userId"].",".$_POST["password"].",".$password_db;
                }
            }
            else
            {
    
                 echo "登录失败2...".$_POST["userId"].",".$_POST["password"].",".$password_db;
            }
        }
    
        function login_callback($row)
        {
            global $password_db;
            $password_db = $row["password"];
        }
    ?>
        3、4   在MySQL建一个测试的数据表:(数据库名字为test)
    
    DROP TABLE IF EXISTS `tb1`;
    CREATE TABLE `tb1` (
      `userid` varchar(30) NOT NULL,
      `password` varchar(50) NOT NULL,
      PRIMARY KEY (`userid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    INSERT INTO `tb1` VALUES ('1', '123456');
    INSERT INTO `tb1` VALUES ('2', '123456');
    INSERT INTO `tb1` VALUES ('3', '123456');
    INSERT INTO `tb1` VALUES ('4', '123456');

    3、5运行结果

    这里写图片描述

    这里写图片描述

    4、结束

    对于unity3d和php的简单交互就到这里,在实际的开发中我们可能通过xml,json等数据格式来在unity 和php之间互传数据。掌握以上知识之后这些就会变得更加简单,犹如有了地基之后,只需要往上添砖加瓦,房子就会越来越大越来越漂亮。

    展开全文
  • 三、Unity3d向安卓通信以及接受通信 四、Unity导出安卓Apk正式签名说明 五、使用Eclipse运行unity导出的工程 六、Java代码接入谷歌内购: 七、谷歌内购Java代码 Unity3d接入googleplay内购详细说明(三) 八、Apk...

    因为本文内容比较多,整理花费时间比较长,故分几篇完成,以下为本文目录结构,方便查阅:


    Unity3d接入googleplay内购详细说明(一)

    引言

    一、准备条件:

    二、谷歌开发者后台应用创建说明:


    Unity3d接入googleplay内购详细说明(二)

    三、Unity3d向安卓通信以及接受通信

    四、Unity导出安卓Apk正式签名说明

    五、使用Eclipse运行unity导出的工程

    六、Java代码接入谷歌内购:

    七、谷歌内购Java代码


    Unity3d接入googleplay内购详细说明(三)

    八、Apk上传谷歌商店测试版以及添加测试者

    九、Zipalign处理APK文件

    十、添加google+群组并邀请其成为测试者

    十一、测试机googleplay安装以及配置:


    Unity3d接入googleplay内购详细说明(四)

    十二、真机测试中出现的常见错误以及解决方式:

    十三、成功测试购买以及正式版发布



    ————————————————————————————————————————————————————————————

    八、Apk上传谷歌商店测试版以及添加测试者

    1、Apk编译完成后需要测试,直接安装到手机上是不能正常进行内购的,一般会提示:


     

    2、阅读谷歌官方文档,才知道必须要上传编译出来的apk到谷歌商店,成为测试版,然后加入自己的测试群组,即测试账号。然后等待谷歌商店给你推送,然后安装推送来的应用才能够测试。

    3、完整走过来才知道,上传、发布、加入测试者、点开测试连接、等待被推送。这一环节顺利完整走下来得需要一天时间,而且主要原因是等待发布以及测试推送,不得不吐槽谷歌的这个不人性化的测试方案。

     

    4、不过呢,经过多次试验,我发现一个窍门就是,当有一个版本上传通过以后,以后只要不更改这个版本号,就能一直不断修改代码测试功能了。而不必每次编译后上传apk。


     九、Zipalign处理APK文件

    1、如过你上传apk文件是eclipes直接编译出来的文件。会遇到以下报错问题。

     

    2、我也不是很懂,简单网上搜了一下,描述如下:

           原文链接:http://www.xuebuyuan.com/2047409.html 

    Zipalign优化工具是Android SDK中自带的apk优化工具,开发者在上传应用到Google Play的时候相信都遇到过“您上传的Apk没有经过Zipalign处理”的失败提示,显而易见Google对Zipalign工具的重视,那么Zipalign到底有什么用了?

        说白了,Zipalign就是一个对Apk文件进行存档对齐的优化工具,它的目的是确保所有的未压缩数据都从文件的开始位置以指定的对齐方式排列。尤其是.apk压缩包中的图片资源和未加工处理的相关文件,对齐的方式是以4字节对齐。其好处是能够减少应用程序的RAM内存资源消耗。Google的Android开发文档中特别之处在发布应用到最终客户之前务必使用Zipalign工具对你的.apk文件进行优化。如果你使用Eclipse中的ADT插件工具导出签名应用的话,其将会自动优化你的应用无需额外使用zipalign工具。或者是你的工程文件ant.properties中制定了密钥存储的路径或密钥的别名,构造脚本也将自动对apk文件进行Zipalign优化处理。、

        用法:

    1. 对已有的APK文件进行Zipalign处理 

    zipalign [-f] [-v]<alignment> infile.apk outfile.apk

    infile.apk表示输入的apk文件,outfile.apk表示输出的apk文件(文件名可以自己制定)。 

    alignment:表示指定的对应字节数,是一个整数且必须指定为4。

    2. 检测已有的APK文件是否进行了Zipalign处理

    zipalign -c -v<alignment> existing.apk

    Flags:

    -f : overwriteexisting outfile.zip

    -v : verboseoutput

    -c : confirm thealignment of the given file

          Zipalign工具位于SDK的tools目录中,以windows操作系统为例,在运行中输入cmd进去Dos操作界面,用cd命令跳转到Zipalign的目录,输入Zipalign的相应命令就能使用其功能了。

     

    3、说了这么多,我总结了一下,只要正式签名,就能够解决了。在实际操作中,是需要在eclipes里面,右键工程:


     


    4、继续,选择导出的工程:




    5、选择签名,输入密码:



    6、需要稍等片刻,然后编译出apk包。以后导出正式版上传谷歌商店时均需要签名。



    7、上传时不是bin下面的apk文件。而是刚才导出的目录下的文件。


     



    8、签名完毕后即可正式上传apk:




    十、添加google+群组并邀请其成为测试者

    谷歌针对测试者有一套独立的系统,个人觉得除了有些浪费时间外。不改版本号,就不用重新上传这点还不错(前文说的小窍门)。

    1、首先在其设置内,有测试账号可以添加。不过这个账号添加上我觉得在实测中好像没什么作用,相比之下,还是下面将介绍的添加群组更靠谱一点。不过为了保险起见,我也是在这把测试账号给加上了。

     

     


    2、点击管理测试人员




    3、注意添加测试人员,是一个google+群组




    4、测试者邀请空白处,要填写的是一串网址,没有群组的话可以去注册一个,随便邀请人员,添加到这个测试组里面

    谷歌群组创建:测试者邀请空白处,要填写的是类似这样一串网址

    https://plus.google.com/communities/108540162344811122738


     

     

    5、只要他们的手机配置好测试环境(vpn课上谷歌商店),打开下面给的链接地址。

     

     

    6、按照网页的提示,点击连接同意成为开发者。等到下载应该用可能需要几个小时的时间


     

     

    7、然后如果是第一次上传的apk,需要等待几个小时后会有推送。如果是后续上传的版本,如果没有大于以前的版本号,是不允许上传的。

    另外不能用0.9.x这个样的版本号,必须为整数

    另外如果作为测试,不修改版本号,使用同一个正式签名,是不必每次产出包都得上传的。




    8、等待几个小时后,打开谷歌商店,就能够在自己手机上安装上传的apk了。


     

     

     

    9、在谷歌后台,可以看到应用的一些基本数据,下载量、安装量、评价等等



    十一、测试机googleplay安装以及配置:

    1、目前国内的安卓手机基本上都没有安装谷歌框架以及谷歌商店,因此没办法直接做测试机使用。推荐大家下载谷歌安装器。他可以自动下载安装谷歌服务、商店、设置。以及修复谷歌服务已停止的问题,和打开谷歌商店即闪退的问题。






    2、安装完毕后,还需要手机vpn,连接到外网。大约需要这几个应用。




    3、安装完毕,先打开vpn,翻墙到外网。然后打开谷歌商店,登陆个人账号,最好是注册一个测试账号。如果能看到付费下载的应用,并且能够弹出付费界面,说明测试付费环境已经ok


    4、打开测试应用:

     


    5、有谷歌的官方弹窗显示商品,就代表至少手机测试环境ok;





    第三篇结语:

    以上就如何测试进行详细解释,在此过程中可能会遇到一些问题,下一篇将对我在测试中出现的常见错误逐一解释,方便大家参考



    展开全文
  • unity的学习中 自然会遇见一个问题 就是关于Unity 前台页面制作登录模块 如何访问到数据库并且进行验证 在asp.net中 我们自然会想到 在前台页面 运用jQuery 进行一次ajax访问 获取后台数据验证 那么 在unity中 ...

    在unity的学习中 自然会遇见一个问题 就是关于Unity 前台页面制作登录模块 如何访问到数据库并且进行验证
    在asp.net中 我们自然会想到 在前台页面 运用jQuery 进行一次ajax访问 获取后台数据验证
    那么 在unity中 如何做呢

    以下就是 一个简单的使用 unity引擎自带的wwwForm功能的一个完整实例 一起看看ba

    在这里插入图片描述首先 在前台页面拖动控件 制作好登录界面

    拖动控件等方法过于简单 先不说

    接下来 新建一个C#代码文件 在里面进行编写

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    
    public class yftestLogin : MonoBehaviour
    {
    
        public InputField Inp_Username;
        public InputField Inp_Password;
    
    
        public string url = "localhost:3787/APITest.ashx";
        public void ToLogin()
    
        {
            //UGUI控件事件不能绑定IEnumerator方法
            this.StartCoroutine(this.Login());
        }
    
    
        public IEnumerator Login()
        {
    
          
            WWWForm sum = new WWWForm();
    
    
            //sum.AddField("ActionCode", "Login");
            sum.AddField("name", Inp_Username.text);
            sum.AddField("pass", Inp_Password.text);
    
    
            WWW ww2 = new WWW(url, sum);
            yield return ww2;
            Debug.Log(ww2.text);
            
    
        } 
    
    
    
    }
    
    

    这是一个完整的unity前台代码
    下面开始进行解释

        public InputField Inp_Username;
        public InputField Inp_Password;
    
    

    获取 unity UI界面的两个文本kuang 就是账号文本框和密码文本框

        public string url = "localhost:3787/APITest.ashx";
    

    这个是要连接的后台的路径

        public void ToLogin()
    
        {
            //UGUI控件事件不能绑定IEnumerator方法
            this.StartCoroutine(this.Login());
        }
    
    

    出现了StartCoroutine 小伙伴们可以访问我给的连接看看 StartCoroutine是什么东西
    StartCoroutine就是开启一个协程,yield return 是迭代器块返回调用迭代的地方

    https://www.cnblogs.com/fly-100/p/3910515.html
    

    这里就是主战场了

    public IEnumerator Login()
        {
    
          
            WWWForm sum = new WWWForm();
    
    
            //sum.AddField("ActionCode", "Login");
            sum.AddField("name", Inp_Username.text);
            sum.AddField("pass", Inp_Password.text);
    
    
            WWW ww2 = new WWW(url, sum);
            yield return ww2;
            Debug.Log(ww2.text);
            
    
        } 
    
    

    建立一个访问后台的功能 非常类似于 ajax访问网页 只是不能异步

      WWWForm sum = new WWWForm();
    
     sum.AddField("name", Inp_Username.text);
      sum.AddField("pass", Inp_Password.text);
    

    这里的AddField 就是我们需要传递到后台的参数 类似于 ajax当中的
    data:{name:Inp_Username.text,pass:Inp_Password.text}

    WWW ww2 = new WWW(url, sum);
            yield return ww2;
            Debug.Log(ww2.text);
    

    实例化 嵌套一下
    ok 似乎没什么问题
    在UI界面给登录按钮绑定好功能
    前台就这样结束啦
    那么后台 ashx呢?

    新建一个网站 创建好ashx 我命名为 APITest.ashx

    这里我使用了EnitityFramwork

    <%@ WebHandler Language="C#" Class="APITest" %>
    
    using System;
    using System.Web;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    
    public class APITest : IHttpHandler {
    
    
        public void ProcessRequest (HttpContext context) {
            //context.Response.ContentType = "text/plain";
            //context.Response.Write("Hello World");
            gameLPYEntities myEntities = new gameLPYEntities();
            foreach (var Model in myEntities.myuser)
            {
    
                if (context.Request["name"].ToString() == Model.id &&
               context.Request["pass"].ToString() == Model.pw)
                {
                    var ss = Model.id;
    
                    var list = myEntities.player.Where(p=>p.id == ss ).Select(p=>p.data);
    
    
                    foreach (var mydata in list)
                    {
    
                        context.Response.Write(mydata);
    
                    }
    
                }
    
            }
    
        }
    
        public void Login(HttpContext context)
        {
            string msg = "this is  Login";
            context.Response.Write(msg);
    
        }
    
        public bool IsReusable {
            get
            {
                return false;
            }
    
             
    
    
        }
    
    }
    

    没什么好细细说的 如果这里的点不明白 我上一篇blog有讲 好 继续

    写好后进行调试

    在这里插入图片描述在这里插入图片描述在这里插入图片描述数据库对比一下 非常正确

    ok 这样就结束啦

    有问题就留言吧 不过我不见得会回哦 ^ ^!

    展开全文
  • 三、Unity3d向安卓通信以及接受通信 四、Unity导出安卓Apk正式签名说明 五、使用Eclipse运行unity导出的工程 六、Java代码接入谷歌内购: 七、谷歌内购Java代码 Unity3d接入googleplay内购详细说明(三) 八、Apk...

    因为本文内容比较多,整理花费时间比较长,故分几篇完成,以下为本文目录结构,方便查阅:


    Unity3d接入googleplay内购详细说明(一)

    引言

    一、准备条件:

    二、谷歌开发者后台应用创建说明:


    Unity3d接入googleplay内购详细说明(二)

    三、Unity3d向安卓通信以及接受通信

    四、Unity导出安卓Apk正式签名说明

    五、使用Eclipse运行unity导出的工程

    六、Java代码接入谷歌内购:

    七、谷歌内购Java代码


    Unity3d接入googleplay内购详细说明(三)

    八、Apk上传谷歌商店测试版以及添加测试者

    九、Zipalign处理APK文件

    十、添加google+群组并邀请其成为测试者

    十一、测试机googleplay安装以及配置:


    Unity3d接入googleplay内购详细说明(四)

    十二、真机测试中出现的常见错误以及解决方式:

    十三、成功测试购买以及正式版发布



    ——————————————————————————————————————————————————————————

     十二、真机测试中出现的常见错误以及解决方式:

    1、如果弹出连接超时,那检查vpn是否正常,手机测试环境是否正常:




    2、如果弹出身份未验证,需要到谷歌后台添加你的账号为测试账号,上文中有详细介绍。




    3、如果弹出此版本未通过结算验证,你用的这个版本多是本地测试版,必须得正式签名明,上传apk,等到谷歌商店推送给你(详细参见前文)。下载才能够测试。无论是alpha版,还是betea版,都是要等待谷歌商店推送给你,长短时间不一,一般为几个小时,我的大约34个小时左右。



     

    4、如果从谷歌商店安装正式版后,在进行操作时会出现以下界面,点击继续会添加银行卡等信息。




    5、必须为带有以下标志的信用卡才能测试,国内银联经测试无效,猜测主要跟大陆地址有关。



     

    6、兑换码因为不了解机制,随便填写的也无法测试


     

     

    7、然后走投无路的我注册了paypal以后,发现倒是可以绑定国内信用卡,至少招商银行,工行的可以。

    然后···但是国内环境无法激活,所以也是不能成功。



     

    8、如果没有把你的账号成功添加测试群组,会出现以下界面。



     

    9、测试版付费会弹出以下界面,据官方文档介绍,此为临时发起的扣款,最终会返还给测试者,因为不是本人亲自经历测试,这个我也不清楚。



     

    10、如果你将应用发布为正式版,购买的也是正式版



     

    十三、成功测试购买以及正式版发布

    1、添加测试账号后,在国内测试真是支付也是比较难办的。

    原因是在这一步需要填写信用卡资料,这里我们做过多次试验,大陆的发的虽然带有上述标志的卡,在填写前一部分信息的时候是可以的。但是当选择实际住址的时候就被拒绝了,也没弄清楚具体原因,我猜想着可能是因为必须要实名对应开卡地址,而选择住址处根本没有中国大陆的选项。香港,台湾的地址倒是有,但是选上也是无用的,因为跟你开卡地址对应不上。

     

    最最后,幸亏同事找了台湾的朋友帮忙测试了一下,然后就ok了。不得不说,这实在是一个大坑啊。

     

    2、测试那边实际支付成功截图:

     

    3、在开发者后台的谷歌钱包里面也能够看到订单的详细介绍。

    https://wallet.google.com/merchant/pages/u/0/bcid-hGKztJklSwyDL8eACsBL4w/oid-WDD6nV4ORYC9aQ6ScdpNaQ/cid-09390602503505599956/purchaseorderdetails/12999763169054705758.1375233850436656

     



    4、接下来,就是把内购接入到你们正式工程当中,有了前文介绍,道理大同小异。

     

    5、最终上传正式游戏的apk,可以选则先上传测试版,接下来将其改为正式版,最终发布。




    至此,谷歌内购的研究基本上算是成功结束,写的不周之处还望各位多多指点。谢谢!

    最终愿各位项目都顺顺利利,不像我这样遍地踩坑。



    展开全文
  • 前段时间把工作辞掉了,发现做的问题有点多,最新发现在做C++服务器和UNITY3D通信,在传输的结构体上,因为两边类型不一样,传输接受全是乱码,搞了1天多,有了一点心得。 其他的类型对应,在网上很容易找到,主要...

    本文为原创,转载请注明出处!

    前段时间把工作辞掉了,发现做的问题有点多,最新发现在做C++服务器和UNITY3D通信,在传输的结构体上,因为两边类型不一样,传输接受全是乱码,搞了1天多,有了一点心得。


    其他的类型对应,在网上很容易找到,主要是C++里面的TCHAR和C#的string对应问题。


    ansi编码   TCHAR占用1个字节      Unicode编码 占用2个字节  

    因为传输的字符串中有中文,所以采用Unicode编码,在C#这边要这么写。


    //结构体采用顺序排列,采用Unicode字符集,1字节对齐
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
    struct CMD_GR_LogonByAccounts
    {
    	public byte     Flags;      //标识
    	//转为string 固定大小10字节
    	[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
    	public string   PassWord;   // 密码
    
    	[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
    	public string   Accounts;	// 帐号
    };



    展开全文
  • Unity 3D 引擎对于开发者来说,入手非常快,因为它采用的是 C# 作为开发语言,这也大大降低了开发者的门槛。但凡只要懂一门编程语言的人都能使用 Unity 3D 引擎开发,另外 Unity 3D 的内部架构设计非常好,采用的...
  • 对于没有从事过android和IOS 开发的朋友,只会使用UNITY3D,想实现微信分享等功能,实在有些费劲。 即使有ShareSDK 这样便利的工具,我也是研究了好一阵子,才都搞明白了。 ShareSDK 官方的文档对于一点不懂...
  • Unity3d接入IOS内购

    2015-06-02 13:09:59
    利用Unity3d制作完毕游戏发布到appstore,有时会做游戏内购买虚拟物品,也就是内购。 在Ios开发中叫做:In App Purchase,简称IPA 那么如何在unity3d内嵌入IPA呢?几经辗转,多方搜索,摸索出点经验,分享给大家,如...
  • 短信验证 1、短信验证我是通过mob的SMSSDK实现的...2、在mob上注册一个账号,创建应用获得key和secret 替换案例中demo中的key和secret,即可 由于案例中的ui是在c#中搭建的,故若想自己搭建可视化ui可按照如下操...
  • 作者:姜雪伟,网名:...已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。研究方向:架构设计、图形学、VR/AR 等。博客网址:http://blog.csdn.net/jxw16...
  • [Unity3d]Player Settings导出设置 分类: Unity3D2013-12-22 14:25 413人阅读 评论(0) 收藏 举报 目录(?)[+] Player Settings is where you define various parameters (platform ...
  • Unity3D 项目加密防止反编译可使用Virbox LM加密方案。对Unity3D游戏项目中的代码及资源保护,Virbox LM有着完善的解决方案,能有效防止代码被反编译,资源文件被盗窃。可直接对assembly-scharp.dll进行加密,自动...
  • ALI.ARPG.Operations
  • Unity3D使用腾讯广点通广告很多做Android开发、游戏开发的朋友找我咨询,开发的应用、游戏如何赚钱,今天我分享下我的经验吧。App想在国内赚钱,“软件收费”是基本上做不起来的,大家都懂,没什么好说的。那么比较...
  • 手游会碰到诸如来电话、锁屏、闹钟等等一系列导致游戏被强制暂停的情况。 有些时候我们需要针对这种情况作出一定的判断和处理,此时就要用到两个方法:OnApplicationPause(bool)方法和OnApplicationFocus(bool)...
  • 一款Unity3d手游制作完成,马上面临上线不同平台——主要ios、安卓;接着是分发各大渠道——ios好说,就只有appstore。安卓阵营纷乱复杂,光国内大大小小的渠道就有几十上百之多,想要上哪个渠道,基本上就得接入...
  • Unity3D配置Photon服务器

    2019-07-22 23:57:40
    Unity3D下配置Photon服务器应用并测试: 工具:Unity 5.6.4f1、Photon_v4-0-29-11263、VS2015 一、准备工作 1、安装PhotonServer服务器:https://www.photonengine.com/en-US/sdks#onpremiseserver  (Photon-...
  • Unity 开发AR之 Vuforia 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— 心分享、心创新!...
  • 2.在Unity Build Settings里面选择平台为Platform为IOS 3.把需要打包的场景添加至Scenes In Build 4.点击左下角Players Settings 5.Player Settings介绍 接下来详细介绍一下,Settings for ios 中的详细设置介绍 ...
1 2 3 4 5 ... 16
收藏数 308
精华内容 123
关键字:

unity3d向后台注册账号