• Unity3D游戏移植到Android平台是一件很容易的事情,只需要在File->Build Settings中选择Android平台,然后点击Switch Platform并Build出apk即可。通常,我们的工作不仅限于此,一般还需要给手机游戏加入计费、广告...

    将Unity3D游戏移植到Android平台是一件很容易的事情,只需要在File->Build Settings中选择Android平台,然后点击Switch Platform并Build出apk即可。通常,我们的工作不仅限于此,一般还需要给手机游戏加入计费、广告等功能。这些功能一般没有提供Unity3D插件,我们需要将游戏导出为Android工程,然后添加这些功能;或者,我们根据这些计费sdk来做自己想要的Unity3D插件,然后直接在Unity3D中使用。有时候,第二种方法不能使用,我们还是需要使用第一种常见的方法。

    1.从Unity3D到Android工程

     为了实现交互,我们采用的是简单的函数相互调用。如果我们在Unity3D中想调用Android代码,那么可以在脚本文件C#中这样写:

    AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    AndroidJavaObject activity = jc.GetStatic<AndroidJavaObject>("currentActivity");
    activity.Call("UnlockGame")

    上面这段代通过"com.unity3d.player.UnityPlayer"这个类获取了当前的Android中的静态成员"currentActivity",取得了Activity就可以调用Android代码了。这个UnlockGame函数是简单的成员方法,一般直接写在MainActivity中,也就是说Android代码中必须要有UnlockGame这个函数,然后才能调用;而"com.unity3d.player.UnityPlayer"和"currentActivity"都是默认的参数。

    如果要在Android工程中调用Unity3D中的方法,我们需要新建一个Android工程。可以这样写java代码:

    UnityPlayer.UnitySendMessage("AndroidManager", "AndroidCallBackUnlockGame", "");

    这里调用了Unity3D中"AndroidCallBackUnlockGame"这个方法,最终激活了游戏。第一个参数表示Unity3D中某个gameObject,第二个参数是这个gameObject上的脚本中的某个方法,第三个参数是这个方法的参数。

    上面只是讲述了交互的基本原理,下面是详细步骤。

    (1)在Unity3D中创建脚本,如上面第一段代码所示,加入调用Android函数的代码;如果Android要调用C#代码,也要写下被Android代码回调的C#函数。然后,把Unity项目导出为Android工程即可。这里需要注意下图红色部分,其中Bundle Identifier就是导出的Android工程的包名。

    (2)打开Eclipse,导入工程,选择import->Existing Android Code Into Workspace,最好把Copy Into WorkSpace选项也选上,这个工程通常叫做“UnityPlayerProxyActivity”。导入工程后,我们可以直接运行这个工程了。但这里是为了与Android代码交互,所以还不能这样做。通常的方法是,我们新建一个Android Application Project,包名必须与导入的工程包名相同;然后把导入的工程作为新工程的Library,在工程的Properties里设置,如下图所示。

    (3)将导入的Unity工程assets目录里的bin和libs目录拖放到新工程的assets目录里,即移动资源位置而已

    (4)好了,现在我们有两个工程,一个是新建的,一个是从Unity3D中导入的。这里必须学点Android开发的基础知识,onCreate函数是入口函数,其它的自学吧。想在Android里调用Unity3D代码,就用本文开头的第二段代码即可。通常,我们在新工程里创建一个Activity,在AndroidManifest.xml里进行设置要启动的Activity。假设要启动的是MainActivity,那么对于MainActivity这个类,我们要让它继承UnityPlayerActivity这个类,然后在Oncreate里调用super.onCreate(savedInstanceState)即可。然后,运行新工程,我们的Unity3D游戏也跟着启动了。

    复制代码
    public class MainActivity extends UnityPlayerActivity {
        
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
        }
    }
    复制代码

     

    既然是基础,我在说的详细点。首先创建新的Android Application Project,注意包名与导入的工程一致,并且不要创建Activity, 我们手动创建。然后新建一个类,类名暂且为MainActivity,package name必须与前面说的一致。然后写上上图中的代码。如果有错误提示,按下ctrl + shift + O可以导入所需类库。我们要手动创建Activity,还要在AndroidManifest.xml这个文件里做设置,如下所示。

    复制代码
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity 
                android:name=".MainActivity"
                android:label="@string/app_name"
                android:configChanges="orientation|keyboard"
                android:screenOrientation="landscape"
                >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    复制代码

    其中的android:name=".MainActivity"表示这个Activity关联的类是前面创建的MainActivity类。已经设置完了,现在可以run了。有一点要记住,如果你在Unity的C#代码里调用了某个Android函数,这里一定要添加这个函数。另外,如果你不添加android:screenOrientation可能会导致程序启动崩溃。

     

    2.从Android工程到Unity3D

    (1)新建一个Android工程,不要创建Activity,在properties属性里把工程设置为library.

    (2)到安装目录C:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer\bin下面复制classes.jar这个文件到Android工程的libs目录下面。

    (3)新建一个类,这里是MainActivity,写法如下,我们会在Unity3D中调用TextToast这个函数。这里同样要注意包名,要与Unity3D中Bundle Identifier相同。注意这里必须使用runOnUiThread处理UI线程。

    复制代码
    public class MainActivity extends UnityPlayerActivity{
    
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
        }
        
        protected void TextToast(final String msg){
            runOnUiThread(new Runnable(){
                public void run(){
                    Text(msg);
                }
            });
        }
        
        public void Text(String msg){
            Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        }
    }
    复制代码

     (4)在菜单里选择Project->Clean,然后在工程目录的bin下面找到刚生成的jar文件,我们可以直接把这个jar文件导入Unity3D中作为插件使用,即放到目录Assets/Plugins/Android下面即可。在Unity3D的安装目录C:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer下面找到AndroidManifest.xml这个文件,也复制到Assets/Plugins/Android这个目录下。打开这个xml文件,修改Activity名称与eclipse工程中的Activity一致,即把com.unity3d.player.UnityPlayerProxyActivity修改为包名.MainActivity,我这里是com.activ8.ppt.MainActivity。设置完成,我们现在可以在Unity3D中使用该插件了,使用方法见本文开头第一段代码。Unity4.3以后,配置文件修改方法已经改变,建议查看Unity Manual文档,查找”Building Plugins for Android",然后查找”AndroidManifest.xml“文件即可看到相关设置代码。

    展开全文
  • 一、感谢声明:本篇文章参考了以下人员的文章,首先对他们的辛勤劳动表示真诚的感谢。1)知乎kilyh(知乎链接为https://www.zhihu.com/people/kilyh/activities)2)博主Dr_Neo(博客地址为:...

    一、感谢声明:

    本篇文章参考了以下人员的文章,首先对他们的辛勤劳动表示真诚的感谢。

    1)知乎kilyh(知乎链接为https://www.zhihu.com/people/kilyh/activities

    2)博主Dr_Neo(博客地址为:http://blog.csdn.net/dr_neo/article/details/49870587)

    3)博主THE NO.5 (博客地址为:http://blog.csdn.net/liushida00/article/details/49797239

    二、手机打开USB调试。

     想把PC机上开发的Unity程序加载到手机,需要做如下准备。

     1)PC机上安装Android SDK开发包,安装方式如下:

     下载Android SDK Tools(链接地址:http://www.androiddevtools.cn/)从该网址指定处下载,截图如下:


          把压缩包下载,下载后,直接解压缩到你想要安装Android的路径就行了。解压后的文件目录如下:

          

       然后就双击“SDK Manager.exe”,启动SDK Manager,在启动的界面里需要勾选若干项下载(其中,Android选择最高版本即可,因为Android向下兼容,本文选的是Android5.1.1),截图如下:



    勾选好安装项后,点击左下角的”Install XX packages“按钮即开始下载,下载过程持续时间会比较长。

    (若以上安装过程有问题,可参考Dr_Neo博客http://blog.csdn.net/dr_neo/article/details/49870587中的第三步)

    安装OK后,设置环境变量。

    这里需要把”\platform-tools“和”\tools”路径追加到系统环境变量Path中,具体如下:

    首先,新建一个系统环境变量,变量名为ANDROID_SDK_HOME,变量值为你的SDK安装路径,这里我的安装路径为D:\android\android-sdk,如图所示:


    然后就是在系统的Path变量后,追加;% ANDROID_SDK_HOME%\platform-tools;% ANDROID_SDK_HOME%\tools,如图所示:


    然后我们可以检验一下Android SDK是否安装成功:在命令行窗口中输入”adb version“,出现如下显示,则安装成功了:

    2)数据线连接手机,并开启USB调试

    本人手机为魅蓝Note5(所以本文以该型手机为例介绍),打开USB调试方式很隐蔽,打开方法如下:

         逐步点击如下按钮:设置->关于手机->版本号:Flyme X.X.X.X等(如下图),在该”版本号“上连续点击7次即可以开启开发者选项(设置->辅助功能->开发者选项),在该选项中开启USB调试。


    3)开启网络调试(确保手机和PC机在一个局域网内)。

    打开电脑cmd窗口,输入以下命令:

    adb tcpip 5555   (该命令打开手机adb网络调试功能),正常情况下控制回显为 restarting in TCP mode port:5555.

    然后再执行下面(其中192.168.0.X是手机局域网的IP地址,请用户改成自己手机的IP地址

    adb connect 192.168.0.x    正常情况下控制台回显为connected to 192.168.0.x:5555

    完成以上2个命令后,手机数据线即可拔掉,后续可通过网络加载程序。

    4)Unity工程设置

    Unity打开你要测试的项目 
    File->Build Settings

    这里写图片描述


    如上图点1,再点2,这一步本应该是在项目刚建立时做的,如果做过了,2就是灰色的(如果点1后,2和3都是灰色的,则界面的右边空白处必然会有open download page字样的按钮,点该按钮下载Android模块即可,加载后2和3就都可以点击了)。转换完之后点3,Inspector面板会如下图所示


    这里的公司名和产品名,不要用默认的,但是可以随便填,然后在下图中会用到:


    在改图中,把默认的Bundle Idedtifier内容改成com.公司名.产品名。设置完3之后,设置4.

    5)加载程序到手机

    点击File->Build & Run,弹出对话框,给Apk取个名字,然后该Apk就会自动推送到手机上,时间可能会稍长,推送完后,在手机弹出的界面中允许安装即可。

    总结:过程中有问题,可以参考以上三位博主的文章,本人亲测成功。




    展开全文
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的...,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入...


    先把STL文件拖到ASSETS下面,然后在此文件对应的inspector中点击open按钮,进入UNITY自带的 STL查看器,在查看器中将其另存为.obj文件,然后将此.obj文件拖动到Assets中,此时可以看到模型图像了,说明能够使用。把此文件从Assets中直接拖动到scene中就可以显示了。obj文件为STL文件一半的大小。此时还不能透明,需要另外建立透明材质然后拖到此模型上,就算绑定了,这样才能设置透明属性。方法:Assets文件夹上点右键,creat–material,此时 Assets中出现材质球(需要命名)同时右侧出现inspector,在inspector中,rendering mode选择fade,然后点击颜色选择框出现对话框,其中A就代表透明度,0为完全透明,这里我设置了30%。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    欢迎使用Markdown编辑器

    你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

    新的改变

    我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

    1. 全新的界面设计 ,将会带来全新的写作体验;
    2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
    3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
    4. 全新的 KaTeX数学公式 语法;
    5. 增加了支持甘特图的mermaid语法1 功能;
    6. 增加了 多屏幕编辑 Markdown文章功能;
    7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
    8. 增加了 检查列表 功能。

    功能快捷键

    撤销:Ctrl/Command + Z
    重做:Ctrl/Command + Y
    加粗:Ctrl/Command + B
    斜体:Ctrl/Command + I
    标题:Ctrl/Command + Shift + H
    无序列表:Ctrl/Command + Shift + U
    有序列表:Ctrl/Command + Shift + O
    检查列表:Ctrl/Command + Shift + C
    插入代码:Ctrl/Command + Shift + K
    插入链接:Ctrl/Command + Shift + L
    插入图片:Ctrl/Command + Shift + G

    合理的创建标题,有助于目录的生成

    直接输入1次#,并按下space后,将生成1级标题。
    输入2次#,并按下space后,将生成2级标题。
    以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

    如何改变文本的样式

    强调文本 强调文本

    加粗文本 加粗文本

    标记文本

    删除文本

    引用文本

    H2O is是液体。

    210 运算结果是 1024.

    插入链接与图片

    链接: link.

    图片: Alt

    带尺寸的图片: Alt

    居中的图片: Alt

    居中并且带尺寸的图片: Alt

    当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

    如何插入一段漂亮的代码片

    博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

    // An highlighted block
    var foo = 'bar';
    

    生成一个适合你的列表

    • 项目
      • 项目
        • 项目
    1. 项目1
    2. 项目2
    3. 项目3
    • 计划任务
    • 完成任务

    创建一个表格

    一个简单的表格是这么创建的:

    项目 Value
    电脑 $1600
    手机 $12
    导管 $1

    设定内容居中、居左、居右

    使用:---------:居中
    使用:----------居左
    使用----------:居右

    第一列 第二列 第三列
    第一列文本居中 第二列文本居右 第三列文本居左

    SmartyPants

    SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

    TYPE ASCII HTML
    Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
    Quotes "Isn't this fun?" “Isn’t this fun?”
    Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

    创建一个自定义列表

    Markdown
    Text-to-HTML conversion tool
    Authors
    John
    Luke

    如何创建一个注脚

    一个具有注脚的文本。2

    注释也是必不可少的

    Markdown将文本转换为 HTML

    KaTeX数学公式

    您可以使用渲染LaTeX数学表达式 KaTeX:

    Gamma公式展示 Γ(n)=(n1)!nN\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通过欧拉积分

    Γ(z)=0tz1etdt&ThinSpace;. \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

    你可以找到更多关于的信息 LaTeX 数学表达式here.

    新的甘特图功能,丰富你的文章

    Mon 06Mon 13Mon 20已完成 进行中 计划一 计划二 现有任务Adding GANTT diagram functionality to mermaid
    • 关于 甘特图 语法,参考 这儿,

    UML 图表

    可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

    张三李四王五你好!李四, 最近怎么样?你最近怎么样,王五?我很好,谢谢!我很好,谢谢!李四想了很长时间,文字太长了不适合放在一行.打量着王五...很好... 王五, 你怎么样?张三李四王五

    这将产生一个流程图。:

    链接
    长方形
    圆角长方形
    菱形
    • 关于 Mermaid 语法,参考 这儿,

    FLowchart流程图

    我们依旧会支持flowchart的流程图:

    Created with Raphaël 2.2.0开始我的操作确认?结束yesno
    • 关于 Flowchart流程图 语法,参考 这儿.

    导出与导入

    导出

    如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

    导入

    如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
    继续你的创作。


    1. mermaid语法说明 ↩︎

    2. 注脚的解释 ↩︎

    展开全文
  • Unity3D项目导入android

    2017-11-03 18:42:35
    今天来说一下如何将Unity3D项目运行在android设备上,以及在这里要注意的一些问题。 我就用Unity3D自代的一那个AngryBots.unity的项目来吧。这个项目是一个游戏项目,玩家控制一个角色在一个建筑中行走,同时会有...
    不得不说Unity很强大,因为一个工具,可以在所有流行的设备上生成应用程序。包括android,ios,linux,windows,mac各种常用操作系统。今天来说一下如何将Unity3D项目运行在android设备上,以及在这里要注意的一些问题。
    我就用Unity3D自代的一那个AngryBots.unity的项目来吧。这个项目是一个游戏项目,玩家控制一个角色在一个建筑中行走,同时会有一些机器人怪物,我们控制的角色有一把冲锋枪。如下图:
    Unity3D项目导入android - ♂苹果 - 眼睛想旅行
      导出到android平台,选择File->Build Setting...
    Unity3D项目导入android - ♂苹果 - 眼睛想旅行
      这里有几个选项。可以看到,这里可以导出为3D页游,也支持ios,PC,Mac,linux,还有flash等等。我们选择android导出。
    Unity3D项目导入android - ♂苹果 - 眼睛想旅行
      最上边那个要选上自已要打包成apk的项目,右下边四个选项,第一个可以不用管,第二个选上时会生成android的eclipse项目,可以导入eclipse。
    设置apk包名,这步比较重要。要不然可能会出错。
    Unity3D项目导入android - ♂苹果 - 眼睛想旅行
     
    如果只是生成apk的话,就上边的选择方式,在player setting设置一下package包的签名,直接点build就可以生成apk了。
    下边主要说一下导入eclipse项目的情况,
    在build setting面板中选上:
    Unity3D项目导入android - ♂苹果 - 眼睛想旅行
     
    这里选择上"Development Build"之后,我们就可以在eclipse里的logcat中看到Unity3D输出的log信息了。同样这里也要像上边直接打包apk那样,更改Player Settings中的Other Setting中的identification中的签名项。
    设置好identification之后,点Export选择好导入android项目文件夹路径。当导出到一半的时候,可能会要求你选择你的android sdk的根路径,不知道是不是我的环境变量没有设置上。
    然后我们打开eclipse,导入我们的Unity3D项目到eclipse:
    Unity3D项目导入android - ♂苹果 - 眼睛想旅行
     如果你没有在Player setting中设置你的identification参数,上边箭头所指的地方会是com.unity3d.player,这时这里会报错,因为这个包名是Unity3D自已的包名,这里就会出现冲突。所以那个identification是一定要设置的。
    然后我们在eclipse中运行我们的项目,设置在手机上运行,手机要在开发者选项中打开调试模式。
    Unity3D项目导入android - ♂苹果 - 眼睛想旅行
    选择我们运行的项目:
    Unity3D项目导入android - ♂苹果 - 眼睛想旅行
     
     设置成在手机上运行:
    Unity3D项目导入android - ♂苹果 - 眼睛想旅行
    下边是在我的红米上运行效果,一点也不会卡,只是在中间有过一次死机,除了这个整个游戏运行非常流畅,而且这个游戏打的.apk包只有25m大小,比一般的cocos2d-x要小很多。
     
    Unity3D项目导入android - ♂苹果 - 眼睛想旅行
     
    然后我们可以在android项目文件夹下的bin目录下找到.apk打包好的文件,你也可以用这个文件安装到别的安卓手机上测试。
    Unity3D项目导入android - ♂苹果 - 眼睛想旅行

    ,当我们运行游戏时,我们可以在eclipse的logcat中看到Unity3D的log输出,如下图:

    Unity3D项目导入android - ♂苹果 - 眼睛想旅行
    说起Unity3D其实比cocos2d-x简单太多了。所有的东西都是现成的东西可以用,那里像cocos2d-x不但编辑器不完美,而且几乎所有东西都要写程序来实现。而且使用的语言是最最复杂的C++语法。所以使用和学习cocos2d-x的门槛要比Unity3D高好几个数量级。
        但在2D游戏方面,cocos2d-x确实是要比Unity3D强大很多,而且是免费开源的引擎,鉴于这两个引擎各自有自已的优缺点,这两个游戏引擎可能会在很常一段时间并存于各大游戏公司,但cocos2d-x入门门槛确实很高,但因为开源,所以前途也会比较广,一般开源的东西都会走的很远。最少在Unity没有对2D有很强大的支持之前会是这样。
    一些个人看法,其实,对于我们作游戏的来说,工具非常重要,但如果所有的游戏公司都使用这种没有一点点技术难度的东西来写游戏,而且设计游戏的技术难度达到了随便一个人都可以来作游戏,那么我们程序员就基本上可以从这个行业退出来了。对一个行业来说,好的东西不是我们使用的游戏引擎有多简单,而是我们自已对谁都会用的东西使用的有多熟练。或者我们有别人没有的工具,或者我们有别人没有的设计方法。这才是我们在行业可以生存的法宝,是个人都可以用的东西,我们就要比别人用的更熟练,大众没有的工具我们要自已设计出来,只有这样我们自已才能在行业竟争中生存下去。
    当市场上出现了一个非常简单的大众化游戏引擎的时候,作为程序员的我们应该感到非常紧张才是我们应该有的第一反应。这时候我们应该在第一时间掌握她,并马上为其设计一些对我们自已在这个行业更有竟挣力的周边工具。让自已与别人不同,并且比别人更优秀比什么都重要,这种事情关呼自已的生死。
     


    展开全文
  • 怎么用unity3d 获取手机地理位置呢?unity的某些场景中,如果需要定位地理位置的话,但是unity却没有提供相应的接口。对于安卓(这里举例,IOS暂没研究)这个时候只能用java写个获取地理位置的方法,然后与unity交互...

    怎么用unity3d 获取手机地理位置呢?unity的某些场景中,如果需要定位地理位置的话,但是unity却没有提供相应的接口。对于安卓(这里举例,IOS暂没研究)这个时候只能用java写个获取地理位置的方法,然后与unity交互。这样就能在unity脚本中获取当前手机的地理位置。 实际开发时,为了方便我直接调用百度的API来获取地理信息。 获取地理位置,有三种方式: 

       1、手机信号塔数据:当移动设备的GPS芯片不能接收到GPS信号时,移动设备就需要与它所连接的手机信号塔通讯和估算它与信号塔之间的距离以不断报告它的地理位置。通过这种方法获得的地理位置数据不如纯粹的GPS数据精确。

         2、WiFi连接:这是一种能够精确获得地理位置数据的方法,但是需要用到有效的WiFi热点。WiFi的地址与GPS坐标是一一对应的。它可以准确地标示出用户所处的位置,因此很多零售商才愿意提供免费的公共WiFi服务,那样它们就能够发布店内移动广告了。

         3、IP地址:地理位置也可以通过与数据连接有关的IP地址来获得。这种方法的准确性会因运营商而异,可靠性也比上述方法要低一些。

         4、GPS:精确,无需连接网络,但是连接时比较耗时。。

        用百度API调用时,首先需要申请一个key。具体的可以去官网试试。根据IP地址调用,比较方便,因为可以直接用http的方式发送请求,然后返回json格式的数据,如下:


    public class AddressTool{
                    //ip为空,默认为本机ip
                    public static IEnumerator GetAddressFromIP(string ipAddress, AddressForQueryIPFromBaidu data)
                    {
                            string baiduKey = "42c43828c02a9f6144dd305643ca73b8";
                            //ip:ip地址(可选,ip不出现,或者出现且为空字符串的情况下,会使用当前访问者的IP地址作为定位参数),ak:用户密钥,
                        //coor:输出的坐标格式(可选,coor不出现时,默认为百度墨卡托坐标;coor=bd09ll时,返回为百度经纬度坐标) 
                            string url = "http://api.map.baidu.com/location/ip?ak="+baiduKey+"&coor=bd09ll&ip=202.198.16.3";
                            WWW w = new WWW(url);
                            //超时时间
                            float t = Time.time;
                            while(!w.isDone){
                                    if(Time.time - t > 15f){
                                            Debug.Log("server time out!");
                                            w.Dispose();
                                            yield break;
                                    }
                                    yield return null;
                            }
                            //接收http请求返回的数据(json格式)
                            string jsonData = w.text;
                //解析成对象
                            AddressForQueryIPFromBaidu result =  (AddressForQueryIPFromBaidu)ValueParse.ParseJsonToClass(typeof(AddressForQueryIPFromBaidu), jsonData);
                    }
            }
            #region AddressForQueryIPFromBaidu
            public class AddressForQueryIPFromBaidu
            {
                    //地址 
                    public string address { get; set; }
                    //详细内容  
                    public Content content { get; set; }
                    //返回状态码
                    public string status { get; set; }
     
    //                public string ToString(){
    //                        return string.Format("根据IP获取地理位置 地址:{0}, 详细内容:{1},返回状态码:{2}",address.ToString(),content,status);
    //                }
            }
            public class Content
            {
                    //简要地址 
                    public string address { get; set; }
                    //详细地址信息
                    public Address_Detail address_Detail { get; set; }
                    //百度经纬度坐标值  
                    public Point point { get; set; }
            }
            public class Address_Detail
            {
                    //城市  
                    public string city { get; set; }
                    //百度城市代码  
                    public string city_Code { get; set; }
                    //区县 
                    public string district { get; set; }
                    //省份
                    public string province { get; set; }
                    //街道
                    public string street { get; set; }
                    //门址
                    public string street_Number { get; set; }
            }
            public class Point
            {
                    public string x { get; set; }
                    public string y { get; set; }
            }


    IP定位的结果精度较差,主要应用获取省份或者城市的位置信息。百度android定位SDK是利用设备当前的GPS信息(GPS定位),网络信息(基站定位 和 Wi-Fi定位)完成定位的。开发者在应用中成功集成百度定位SDK(包括一个armeabi的文件夹也得放在libs中)以后,既可以方便的通过定位SDK的接口向百度定位服务请求位置信息。下载百度定位的SDK,导入到安卓工程中。相关Android代码,如下:

    package com.zs.address;
    import org.json.JSONException;
    import org.json.JSONObject;
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import com.baidu.location.BDLocation;
    import com.baidu.location.BDLocationListener;
    import com.baidu.location.LocationClient;
    import com.baidu.location.LocationClientOption;
    import com.baidu.location.LocationClientOption.LocationMode;
    import com.unity3d.player.UnityPlayer;
    import com.unity3d.player.UnityPlayerActivity;
     
    @SuppressLint("NewApi")
    public class MainActivity extends UnityPlayerActivity{
            public LocationClient mLocationClient = null;
            public BDLocationListener mListener = new MyLocationListener();
     
    //        private TextView text;
    //        private Button againBtn, clearBtn, startBtn, stopBtn;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    //setContentView(R.layout.activity_main);
                    //initView();
                    //初始化百度定位SDK
                    initLocationService();
            }
             
            @SuppressLint("NewApi")
            public void initLocationService() {
                    // 声明LocationClient类
                    mLocationClient = new LocationClient(getApplicationContext());
                    mLocationClient.registerLocationListener(mListener);//注册监听函数
                     
                    LocationClientOption option = new LocationClientOption();
                    option.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式
                    option.setCoorType("gcj02");// 返回的定位结果,默认值gcj02
                    option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms
                    option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
                    option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
                    option.setOpenGps(true);//
                    mLocationClient.setLocOption(option);
                    mLocationClient.requestLocation();
            }
             
            //启动定位服务,给unity调用
            public void startLocationService(){
                    mLocationClient.start();
            }
            //停止定位服务,给unity调用
            public void stopLocationService(){
                    mLocationClient.stop();
            }
     
            class MyLocationListener implements BDLocationListener{
                    @Override
                    public void onReceiveLocation(BDLocation location) {
                            // public int getLocType ( )返回值:
                            // 61 : GPS定位结果
                            // 62 : 扫描整合定位依据失败。此时定位结果无效。
                            // 63 : 网络异常,没有成功向服务器发起请求。此时定位结果无效。
                            // 65 : 定位缓存的结果。
                            // 66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果
                            // 67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果
                            // 68 : 网络连接失败时,查找本地离线定位时对应的返回结果
                            // 161: 表示网络定位结果
                            // 162~167: 服务端定位失败
                            // 502:key参数错误
                            // 505:key不存在或者非法
                            // 601:key服务被开发者自己禁用
                            // 602:key mcode不匹配
                            // 501~700:key验证失败
                            if (location == null)
                                    return;
                            JSONObject jo = new JSONObject();
                            try {
                                    jo.put("error_code", location.getLocType());
                                    jo.put("time", location.getTime());
                                    jo.put("latitude", location.getLatitude());//获取维度
                                    jo.put("lontitude", location.getLongitude());//获取经度
                                    jo.put("radius", location.getRadius());
                                    jo.put("direction", location.getDirection());
                                    //只有使用GPS定位的情况下,获取移动速度,当前连接的卫星编号
                                    if(location.getLocType() == BDLocation.TypeGpsLocation){
                                            JSONObject gpsInfo = new JSONObject();
                                            gpsInfo.put("speed", location.getSpeed());
                                            gpsInfo.put("satellite", location.getSatelliteNumber());
                                            jo.put("gpsInfo", gpsInfo);
                                    }else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
                                            // 只有使用网络定位的情况下,才能获取当前位置的反地理编码描述。
                                            // 自定位SDK2.6版本之后,支持获取省/市/区分级地理信息:
                                            JSONObject netWorkInfo = new JSONObject();
                                            netWorkInfo.put("address", location.getAddrStr());//获取反地理编码
                                            netWorkInfo.put("province", location.getProvince());//获取省份信息
                                            netWorkInfo.put("city", location.getCity());//获取城市信息
                                            netWorkInfo.put("city_code", location.getCityCode()); //获取城市编码
                                            netWorkInfo.put("district", location.getDistrict()); //获取区县信息
                                            netWorkInfo.put("street", location.getStreet()); //获取街道地址
                                            netWorkInfo.put("street_number", location.getStreetNumber()); //获取街道门牌号
                                            jo.put("netWorkInfo", netWorkInfo);
                                    }
                            } catch (JSONException e1) {
                                    Log.i("address", e1.toString());
                            }
                             
                            Log.i("address", jo.toString());
                            //将获取的地理信息返回给unity
                            UnityPlayer.UnitySendMessage("address", "AddressCallback", jo.toString());
                            //text.setText(jo.toString());
                    }
            }
             
            private void requestLocation() {
                    mLocationClient.requestLocation();
            }
            @Override
            public boolean onCreateOptionsMenu(Menu menu) {
                    // Inflate the menu; this adds items to the action bar if it is present.
                    getMenuInflater().inflate(R.menu.main, menu);
                    return true;
            }
     
    //        private void initView(){
    //                text = (TextView)findViewById(R.id.textView);
    //                againBtn = (Button)findViewById(R.id.button1);
    //                clearBtn = (Button)findViewById(R.id.button2);
    //                startBtn = (Button)findViewById(R.id.button3);
    //                stopBtn = (Button)findViewById(R.id.button4);
    //                againBtn.setOnClickListener(clickListener);
    //                clearBtn.setOnClickListener(clickListener);
    //                startBtn.setOnClickListener(clickListener);
    //                stopBtn.setOnClickListener(clickListener);
    //        }
    //        
    //        private View.OnClickListener clickListener = new View.OnClickListener() {
    //                public void onClick(View v) {
    //                        switch (v.getId()) {
    //                        case R.id.button1:
    //                                requestLocation();
    //                                break;
    //                        case R.id.button2:
    //                                text.setText("");
    //                                break;
    //                        case R.id.button3:
    //                                startLocationService();
    //                                break;
    //                        case R.id.button4:
    //                                stopLocationService();
    //                                break;
    //                        default:
    //                                break;
    //                        }
    //                }
    //        };
    }

    设置AndroidManifest.xml
    在application标签中声明service组件,这是百度SDK的定位service

    <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
    </service>
    声明使用权限

    <!-- 这个权限用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <!-- 这个权限用于访问GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
    <!-- 用于读取手机当前的状态-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <!-- 访问网络,网络定位需要上网-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!—SD卡读取权限,用户写入离线定位数据-->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
    <!--允许应用读取低级别的系统日志文件 -->
    <uses-permission android:name="android.permission.READ_LOGS"></uses-permission>

    把MainActivity的一些注释打开,然后继承Activity,就可以直接做成app在手机上运行了。该项目demo,在本文最后。

           接下来就是把该安卓项目的代码打成jar包,然后放在unity项目资源下的Plugins->Android目录下。再把libs(里面只能放百度的第三方jar包,不要把unity的class.jar,和Android的jar包放在里面)、res文件夹、AndroidManifest,也放在Android目录下。在场景中放上一个空物体,名为‘address’(必须和java代码中“UnityPlayer.UnitySendMessage("address", "AddressCallback", jo.toString());”保持一致),编写一个脚本“AddressTest.cs”,绑在该空对象上面。,该脚本如下:

    using UnityEngine;
    using System.Collections;
    using address;
    public class AddressTest : MonoBehaviour {
            //地理信息 
            private string geography = "lala haha wawa";
            private GUIStyle style = new GUIStyle();
     
            private int count = 0;
            private AndroidJavaObject jo;
     
            public void Awake(){
                    //GUI样式 
                    style.fontSize = 30;
                    style.wordWrap = true;
                    //初始化安卓的MainActivity。下面两句话是固定的,不能变动
                    AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                    jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            }
     
            //回调函数,接收到地理信息,展示在页面上。 
            public void AddressCallback(string jsonStr){
                    Debug.Log("zs : "+jsonStr);
                    geography = "第"+ (++count).ToString()+"次接受信息:" + jsonStr;
            }
     
            void OnGUI(){
                    GUI.Label(new Rect(0,0,700,300),geography,style);
                    //启动地理服务
                    if(GUI.Button(new Rect(0, 400,60,30)," 启 动 ")){
                            jo.Call("startLocationService");
                    }
                    //关闭地理服务
                    if(GUI.Button(new Rect(140, 400,60,30)," 停 止 ")){
                            jo.Call("stopLocationService");
                    }
            }
    }

    转载地址:http://www.taikr.com/article/351
    展开全文
  • Unity3D部署导出的Webgl项目同时支持手机 Foldcc  2017-8-18 Unity在抛弃掉flash后支持导出全新的H5项目WegGl,但是目前Unity3D导出的Webgl不支持在手机上使用,原因是手机上的硬件性能相对来说要弱而且很多...
  • Unity3D手机游戏开发

    2019-01-08 08:03:56
    Unity3D手机游戏开发》 基本信息 作者: 金玺曾 出版社:清华大学出版社 ISBN:9787302325550 上架时间:2013-8-7 出版日期:2013 年8月 开本:16开 页码:1 版次:1-1 所属分类:计算机 更多关于 》...
  • 这个工具呢,博主在Unity3D游戏开发之反编译AssetBundle提取游戏资源这篇文章中其实已经提到过了,不过因为有些朋友对如何使用这个工具依然存在问题,所以博主决定特地写一篇文章来讲解如何使用disunity来提取Unity...
  • 1. unity3d介绍 这是一个跨平台的3维游戏开发引擎,封装程度非常高,使用者完全不用管平台的问题 比如我开发android的应用,只需要导入模型,写模型要怎样旋转即可,至于android、dalvik虚拟机、java,完全用不到...
  • Unity3D Editor】导入图片自动转换成Sprite https://blog.csdn.net/july_unity/article/details/79275097 一,导入 1,无论是什么格式的图片(最好直接使用PS直接导出的PSD格式),Unity都会自己搞一套格式,...
  • 本文介绍了Unity3D界面及游戏对象基本操作。
  • 在网上搜了好多资料关于如何自适应各种繁杂平台的手机屏幕分辨率,找到了一个关键词UIRoot,于是乎去下载了NGUI插件,这是一个Unity3D上开发2D游戏最好的插件了。 教程环境:Unity4.5.1f3, NGUI v3.7.1。若界面...
  • 我使用的unity3d版本是:2018.2.8f1。 出现问题的场景: 在unity3d中按正常流程到处android类库,在windows7电脑上的模拟器(android10)上运行没有问题。但是到了我的mac上的模拟器就出问题了,打开就报这个错误,...
  • unity3D-下载安装指南

    2020-02-17 20:20:28
    下载安装unity3D ​ 2.下载安装JavaJDK ​ 3.下载安装AndroidSDK ​ 4.下载安装NDK ​ 5.在unity3D中将2-4安装的地址在制定位置连接上[最重要的一步] ​ 6.3DMax下载安装 ​ 7.3DMax基本使用 ​ 8.3DMax 创建一个...
  • 引言:在做应用或游戏开发的时候,有时候我们会需要让设备有明显的响应输出以增强交互效果,常见的有:音频输出、屏幕闪烁和手机震动,这里我们就来实现以下如何在Unity中调用安卓和苹果手机的震动接口。实现步骤:...
  • 今天呢,博主将为大家送上Unity-Android系列的最后一篇文章《Unity3D游戏开发之从Unity3D到Eclipse》。通过前面的学习,大家已经知道通过在Eclipse中为Unity编写插件的方法,我们可以实现在Unity与Android API的通信...
  • Unity3D手游开发实践

    2018-04-29 10:58:53
    虽然基于Unity3D,很多东西同样适用于Cocos。本文从以下10大点进行阐述:架构设计、原生插件/平台交互、版本与补丁、用脚本,还是不用?这是一个问题、资源管理、性能优化、异常与Crash、适配与兼容、调试及开发工具...
  • unity3d的图片资源在导入的时候会出现尺寸改变的原因,上图说话: 之前的Max Size设置成了1024,明显比1280小,所以u3d会自动的把超过的图片资源按照原先的尺寸成比例缩小,这就造成了图片资源跟原先的不一样。 ...
  • 调用安卓的方向传感器,应用到unity当中,用到的工具:Unity 5.0 VS2013 Eclipse
  • 想要用Unity实现一个二维码扫描的功能,然后网上找插件,找到一个貌似叫EasyCodeScanner,但下载下来用用,真不好使,一导入运行就报错,调好错了再运行发现点按钮没反应,反复试了几遍发现还是没反应,没办法看源码...
1 2 3 4 5 ... 20
收藏数 2,711
精华内容 1,084