精华内容
下载资源
问答
  • Android Unity3D基础

    热门讨论 2011-07-17 22:54:52
    Android Unity3D基础 文章地址 http://blog.csdn.net/libeifs/article/details/6612919
  • Android Unity3D基础.pdf

    2013-12-04 16:32:36
    Android Unity3D基础.pdf
  • Android Unity3D游戏开发之切割方块 菜鸟必备研究佳品
  • Android Unity3D游戏开发之躲避方块 文章地址 http://blog.csdn.net/libeifs/article/details/6651968
  • Android Unity3d 通信总结

    千次阅读 2017-04-13 23:32:07
    Unity3dAndroid交叉开发主要有两种方式,一是Unity3d导出Android工程,二是Android生成jar包,导入到unity3d plugin/bin/目录下,本篇分析第二种方式 Unity3d采用反射的方式调用Android jar包里面的方法 void ...

    Unity3d与Android交叉开发主要有两种方式,一是Unity3d导出Android工程,二是Android生成jar包,导入到unity3d plugin/bin/目录下,本篇分析第二种方式

    Unity3d采用反射的方式调用Android jar包里面的方法

    	void Start(){
    		#if !UNITY_EDITOR
    		unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    		currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
    		connectionClient = new AndroidJavaObject("com.test.connection.ConnectionClient", currentActivity);
                    connectionClientClass = new AndroidJavaClass("com.test.connection.ConnectionClient");
                    #endif
             }

    反射生成ConnectionClient对象。

        public ConnectionClient(Activity activity){
    
            init(activity);
        }
    Java类的构造方法


    	public void CallPublicMethod(){
    		Debug.Log("CallPublicMethod");
    		connectionClient.Call("publicMethod");
    
    	}
    	public void CallStaticMethod(){
    		Debug.Log("CallStaticMethod");
    		connectionClientClass.CallStatic("staticMethod");
    	}
    通过connectionClient对象就可以调用ConnectionClient的公共方法,静态方法



    	public bool CallMethod(){
    
    		Debug.Log("CallMethod");
    		bool result = connectionClient.Call<bool>("publicMethodReturnBoolean");
    		Debug.Log("CallMethod result:"+result);
    		return result;
    	}
    利用泛型调用有返回值的方法,基本类型和string都可以,C#的object和Java object不能互通。

    public void CallMethod(){
    
    	CallMethodWithArgs ("a", "b", "c");//第一种可变长度参数方式
    	//connectionClient.Call ("method", "a", "b", "c");//第二种直接调用
    }
    private void CallMethodWithArgs(params string[] args){
    	connectionClient.Call ("method", args);
    }
    

    若是要传递多个参数,可以采用以上两种方式


    	void ReceiveMethod(string msg){
    		print("Receive from Android");
    		Debug.Log (""+msg);
    	}

    Unity3d Receiver通过设置一个方法Receive专门处理Android 发送消息,也能起到简单的通信


        public static void noticeUnity(String message) {
            UnityPlayer.UnitySendMessage("Receiver", "RecevieMethod", message);
        }

    Android端通过UnityPlayer.UnitySendMessage("Receiver", "ReceiveMethod",message);向Uniry传递消息。


    Unity3d导出工程供Android调用参考这篇文章

    http://blog.csdn.net/crazy1235/article/details/46733221


    http://blog.csdn.net/acnt3w/article/details/52817071


    展开全文
  • Android Unity3d demo 源码 AngryBots

    热门讨论 2013-04-18 11:38:21
    Unity3d 的 demo AngryBots 导出的 Android 源码。
  • 它有两种方式来实现AR功能,第一种是用JNI,使用NDK(自行百度google查找相关技术文章),第二种是AndroidUnity3D的交互,Ar图形,模型视频等由Unity3D来完成,Android来处理 加载创建 扫描 脱卡...

    这是我第一次写博文,只是我做过项目的一些技术点,也就相当于自己的笔记,希望能对看到文章的你有用。

    公司项目比较多使用AR,一般我们都是使用第三方SDK,使用的EasyAR。它有两种方式来实现AR功能,第一种是用JNI,使用NDK(自行百度google查找相关技术文章),第二种是Android和Unity3D的交互,Ar图形,模型视频等由Unity3D来完成,Android来处理 加载创建 扫描 脱卡等事件处理(着重讲这部分)。

    Unity导出的项目:

    我记录Android这部分的操作 不记录Unity3D的

    首先你要让Unity的工程师导出一份Android项目给你,当然导出的AS项目(我没用过Eclipse的方式)

    Unity导出项目结构.png

    lib文件下面是要使用的Jar包

    src中包括了assets,jniLibs和java文件夹下的UnityPlayerActivity,UnityPlayerNativeActivity,UnityPlayerProxyActivity.建议使用UnityPlayerActivity.java,assets文件中是unity的一些资源文件,包括了场景和渲染的一些文件,jniLibs当然是所用到的.so文件了

    如果你已经有Android的工程项目了,此时你只需要把assets的文件和lib中的文件,和jniLibs的文件拷贝到你的项目中去,然后把需要配置的类和权限在AndroidManifest.xml中配置一下(EasyAR需要用到摄像头的权限,在6.0以上的版本也无需去申请权限,SDK中有集成了。如果你不放心 可以再去申请)

    没有项目,那么只需要把unity的导出项目直接导入到你的Android Studio中即可。

    下面就是我导入完成后的项目结构图

    项目结构.png

    ArMapActivity的布局

    android:layout_width="match_parent"

    android:layout_height="match_parent">

    android:id="@+id/layout_unity"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical">

    先介绍一下 两者之间的调用方法的方式:

    Android调用Unity的方法

    UnityPlayer.UnitySendMessage("ImageTargetManager", "LoadNativeAssetBundle", json);

    第一个参数"ImageTargetManager"是Unity Object对象,需要在Unity对象上绑定脚本】

    第二个参数"LoadNativeAssetBundle"是Unity 中定义的方法名 (这两个都是Unity工程师会提供给你的)

    第三个参数是定义方法的参数(可空)。

    Unity调用Android的方法

    先在Android自定义一个方法

    Android代码

    /**

    * Unity调用此方法并把参数jsonString 调用给Android

    * @param jsonString

    */

    public void Unity3DSendMessage(String jsonString) {

    Log.i("TAG", "[Unity3DSendMessage] " + jsonString);

    final JsonRetrun entity = new Gson().fromJson(jsonString, JsonRetrun.class);

    switch (entity.getActionName()) {

    case "sceneLoaded":

    break;

    case "loadModelAssetCompleted":

    break;

    case "imageTargetBound":

    break;

    case "imageTargetBoundFail":

    break;

    case "TargetFound":

    break;

    case "TargetLost":

    break;

    default:

    break;

    }

    }

    Unity代码

    AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");

    AndroidJavaObject jo = jc.GetStatic ("ArMapActivity");

    jo.Call ("Unity3DSendMessage","");

    jo.call(String str1,String str2);第一个参数是Android的方法名,第二个参数是传递给Android的参数

    到这边已经把Android交互Unity的方法方式介绍完成了

    发现的一个坑

    当你使用玩AR时 点击系统返回或者是自定义的ImageButton返回时, 如果你调用的是onDestroy方法,你会发现应用出现了Crash,如果你单单在点击事件中 finish();该Activity,也会出现Crash。

    UnityPlayerActivity中onDestory方法是这么写的

    @Override

    protected void onDestroy()

    {

    mUnityPlayer.quit();

    super.onDestroy();

    }

    这样写 会使后面的代码不执行了,从而造成Crash

    对mUnityPlayer.quit()方法的反编译之后 发现quit方法是这样的

    public void quit() {

    this.k = true;

    if(!this.e.e()) {

    this.pause();

    }

    this.a.a();

    try {

    this.a.join(4000L);

    } catch (InterruptedException var1) {

    this.a.interrupt();

    }

    if(this.g != null) {

    this.h.unregisterReceiver(this.g);

    }

    this.g = null;

    if(l.c()) {

    this.removeAllViews();

    }

    if(i.b) {

    i.g.a(this.h);

    }

    this.kill();

    h();

    }

    注意倒数第二行的this.kill()方法,不看实现可以猜出应该是杀进程的。所以...

    我google百度了不少时间发现了 可以在该Activity的AndroidManifest.xml中设置一个新的进程。这样,就不会影响你本身项目的进程

    AndroidManifest设置.png

    这样设置之后,虽然解决了不会崩溃问题,但是有时候退出Activity时会卡住一段时间。

    我在搜索mUnityPlayer.quit()的时候还看到别人针对这个问题做了另外一种解决,就是重写UnityPlayer类的kill方法(就是上面提到的kill方法,然后再去调用自己重写的方法即可

    重写的例子如下:

    public class MyUnityPlayer extends UnityPlayer {

    public MyUnityPlayer(ContextWrapper contextWrapper) {

    super(contextWrapper);

    }

    //不执行父类的方法

    @Override

    protected void kill() {

    }

    }

    然后在有Unity的ArMapActivity中

    @Override

    protected void onCreate(Bundle savedInstanceState)

    {

    super.onCreate(savedInstanceState);

    mUnityPlayer = new MyUnityPlayer(this);

    layoutUnity.addView(mUnityPlayer);

    mUnityPlayer.requestFocus();

    }

    这样子,就能解决退出Activity不Crash,并且响应速度也比较快。

    展开全文
  • 游戏开发教程系列书籍整理 iOS Android Unity3d flash网页游戏 移动应用 端游.pdf
  • android Unity3D 修改加强

    2015-07-08 19:36:02
    Unity3D 游戏中对Assembly-CSharp coins 是很容易找的 在drinks的搜索之下没有合适的,或者是修改不成功的情况下,要透过drinks ,在其他函数中寻找到关键点;

    Unity3d游戏之无cd

    skill

    cdtime

    //UI显示时
    //修改技能cd
    private void CDshow()
    {
        if (FightUI.fighUI != null)
        {
            for (int i = 0; i < this._playSkill.Length; i++)
            {
                if (this._playSkill[i].curCDtime < this._playSkill[i].skillCD)
                {
                    FightUI.fighUI.setCD(i);
                    PlaySkill skill1 = this._playSkill[i];
                    skill1.curCDtime += 100f; //设置cd时间 = skillcdtime      skill1.curCDtime += Time.deltaTime;
                    UIManager.Self.skillCD[i].fillAmount = this._playSkill[i].curCDtime / this._playSkill[i].skillCD;
                }
                else if (this._playSkill[i].mp <= this.curMp)
                {
                    FightUI.fighUI.SetTrue(i);
                    FightUI.fighUI.MPLess[i].SetActive(false);
                }
                else
                {
                    FightUI.fighUI.MPLess[i].SetActive(true);
                    FightUI.fighUI.NotOverTime[i].SetActive(false);
                }
            }
        }
        this.comboCD -= 100f;   //连击cd  this.comboCD-= Time.deltaTime;
        if (this.recover < 1f)
        {
            this.recover += Time.deltaTime;
        }
        else
        {
            this.AddHp(this.CurHpRecover);
            this.AddMp(this.CurMpRecover);
            this.recover = 0f;
        }
    }
    
     
    
    
    //使用skill 时
    //设置mp
    public void SetSkill(int skill)
    {
        if (((((this._StateEnum != StateEnum.Win) && (this._StateEnum != StateEnum.Dead)) && (this._StateEnum != StateEnum.Skill)) && Data.GameRun) && !this.pause)
        {
            if (FightUI.fighUI != null)
            {
                FightUI.fighUI.canpause = true;
            }
            if (this.playclick == clickEnum.skillPoint)
            {
                this.playclick = clickEnum.all;
                GuideUI.self.guideTips[Data.guideCount].SetActive(false);
            }
            this.audio.clip = null;
            this.audio.Stop();
            if ((((this._StateEnum != StateEnum.Skill) && (this._StateEnum != StateEnum.ComboAttack)) && ((this._StateEnum != StateEnum.LeapAttack) && (this._StateEnum != StateEnum.ViolentAttack))) && (((this._StateEnum != StateEnum.HeavyHit) && (this._StateEnum != StateEnum.ViolentAttack)) && ((this._playSkill[skill].curCDtime >= this._playSkill[skill].skillCD) && (this.curMp >= this._playSkill[skill].mp))))
            {
                this._playSkill[skill].curCDtime = 0f;    //  开始在这里设置cd,可时ui有问题 ,
                FightUI.fighUI.SetFalse(skill);
                UIManager.Self.skillCD[skill].fillAmount = 0f;
                this.curMp += this._playSkill[skill].mp;   //不减少mp 减少   this.curMp -= this._playSkill[skill].mp; 
                UIManager.Self.playMpSlider.fillAmount = (this.curMp * 1f) / ((float) this.MP);
                this._Animator.SetFloat("Forward", -1f);
                this._Animator.SetInteger("AttackI", -1);
                if (!this.ThisRigidbody.isKinematic)
                {
                    this.ThisRigidbody.velocity = Vector3.zero;
                }
                else
                {
                    this.ThisRigidbody.isKinematic = false;
                    this.ThisRigidbody.velocity = Vector3.zero;
                }
                this._StateEnum = StateEnum.Skill;
                this.CurAttackI = -1;
                this.CurSkillI = skill;
                if (this._playSkill[skill].havaPre)
                {
                    this._Animator.Play("preSkill" + this.CurSkillI, -1, 0f);
                }
                else
                {
                    this._Animator.Play("Skill" + this.CurSkillI, -1, 0f);
                }
            }
        }
    }
    
     
    
    
    
    
    
    //设置爆发
    
    public void SetViolent()
    {
        this.audio.clip = null;
        this.audio.Stop();
        if (((this.CurViolentTime <= 0f) && (this.curViolent >= this.playViolent)) && (((this._StateEnum != StateEnum.Hurt) && (this._StateEnum != StateEnum.Skill)) && (this._StateEnum != StateEnum.Dead)))
        {
            if (FightUI.fighUI != null)
            {
                FightUI.fighUI.canpause = true;
            }
            this.curViolent = 0x3e8;  //当使用时  不清除为0  this.curViolent = 0;
            UIManager.Self.violentBar.fillAmount = 0f;
            this._Animator.SetInteger("AttackI", -1);
            this._Animator.Play("Violent", -1, 0f);
            this._StateEnum = StateEnum.ViolentAttack;
            if (this.playType == 0)
            {
                this.tt.enabled = true;
                this.changeMaterial(this.ViolentMaterial);
                this._Animator.speed = this.ViolentSpeed;
            }
        }
    }




    Unity3D 游戏中对Assembly-CSharp

    coins 是很容易找的

    在drinks的搜索之下没有合适的,或者是修改不成功的情况下,要透过drinks ,在其他函数中寻找到关键点;




    展开全文
  • Android unity3d 交互传递消息

    千次阅读 2017-02-16 11:21:03
    然后用Android studio运行起来,点击【调用Android方法】按钮,这个方法会被调用,并在屏幕上弹出一个Toast显示unity发过来的消息。

    unity调用Android的方法

    脚本如下:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class UseAndroidApi : MonoBehaviour {
        private string message = "我来自unity";
        void Start () {
        }
    
        void Update () {
        }
    
    
        void OnGUI(){
            message = GUILayout.TextField (stringToEdit, GUILayout.Width(300),GUILayout.Height(100));
            if(GUI.Button(new Rect(10,120,200,100),"调用Android方法")){
                using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
                {
                    using( AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
                    {
                        //要传递过去的参数
                        object[] message=new object[2];
                        message [0] = 1;
                        message [1] = message;
                        jo.Call("OnUnityMessage",message);
                    }
    
                }
            }
        }
        //用来接收Android发过来的消息
        void OnAndroidMessage(string str){
            str = message;
        }
    }
    

    把它挂载到Main Camera之后运行效果如图:

    这里写图片描述

    其中关键的部分代码是17~28行,这里表示请求调用Android当前activity里面的OnUnityMessage方法,并向这个方法传递了两个参数,一个int类型的’1’和一个String类型的’message’,32~34行的代码则是定义了供Android端调用的一个方法。unity端准备完成之后,导出Android 项目:

    这里写图片描述

    用Android studio打开导出的项目,找到UnityPlayerActivity这个类,然后直接加入方法:

     @Override
     protected void onCreate(Bundle savedInstanceState) {
            ...
     }
     public void OnUnityMessage(int whit, String message) {
            Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
     }

    然后用Android studio运行起来,点击【调用Android方法】按钮,这个方法会被调用,并在屏幕上弹出一个Toast显示unity发过来的消息。

    Android调用unity方法

    Android调用unity方法很简单,只有一句话:

    UnityPlayer.UnitySendMessage("Main Camera", "OnAndroidMessage", message);

    第一个参数传我们刚才挂载脚本的Main Camera名称,第二个参数传我们要调用的unity脚本里面的方法,第三个参数我们要给方法传过去的消息。

    直接修改刚才导出的Android studio项目UnityPlayerActivity类的代码:

     @Override
     protected void onCreate(Bundle savedInstanceState) {
            ...
     }
     public void OnUnityMessage(int whit, String message) {
            Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
            sendMessageToUnity("这是android 收到消息之后又发回来的消息。");
     }
     public void sendMessageToUnity(String message) {
            UnityPlayer.UnitySendMessage("Main Camera", "OnAndroidMessage", message);
     }

    这样就完成了,用Android studio运行起来,点击【调用Android方法】按钮,unity会调用Android的OnUnityMessage方法,并在屏幕上弹出一个Toast显示unity发过来的消息。而OnUnityMessage方法会接着unity端发过去一条消息。

    自此Android unity3d 代码交互传递消息就讲解完了,去尝试着用unity给Android开发一些好玩的插件吧。

    展开全文
  • 目的:截取Android Unity3d游戏交互事件,例如游戏中的keycode事件,并做自定义修改。 工具:apktool , .net Reflector 以及插件Reflexil 前言: Android游戏的项目中,遇到Unity3D游戏的情况特别多。研究一下...
  • Android unity3d 输入框

    千次阅读 2012-08-19 01:07:29
    //用户名 private var editUsername : String; //密码 private var editPassword : String; //提示信息 private var editShow : String; function Start() {  editShow = "canyou请您输入正确...
  • Android unity3d 滑块

    千次阅读 2012-08-19 01:08:35
    //纵向滑动条数值 var verticalValue : int = 0; //横向滑动条数值 var horizontalValue : float = 0.0f; function OnGUI () ... verticalValue = GUI.VerticalSlider (Rect (25, 25, 30, 100), ver
  • 有需求是在完整的apk中截取Android Unity3D并暴露Java的接口。这次文章就是这方面实现的一个小例子。 首先反编译apk,把asserts/bin/manager 文件下的UnityEngine 中的getkey 方法加入调用Android代码的调用: ...
  • android unity3d开发学习第一步

    千次阅读 2013-08-06 14:11:33
    1:下载unitysetup 开发环境  http://unity3d.com/unity/download/download-windows 2:下载三维制作软件 制作我们需要的场景   http://unity3d.9ria.com/?p=437
  • 一个unity3d游戏在运行,我想通过自己写的一个apk去获取当前它这个游戏播放音乐时状态,其中主要是暂停状态,有没有人涉及过啊?能不能借到某个特定的广播消息或有某些接口来获取?
  • Android unity3d Tab选项

    2012-08-19 01:10:31
    //工具栏选择按钮的ID private var select : int; //工具栏显示按钮的字符串 private var barResource : String[]; //选择按钮是否被按下 private var selectToggle0: boolean;...private var
  • Android unity3d 相对群组

    2012-08-19 01:06:49
    //贴图 var viewTexture0 : Texture2D; var viewTexture1 : Texture2D; function OnGUI () {  //开始这个群组  GUI.BeginGroup(new Rect(10, 50, 200, 400));  //显示贴图,坐标为相对... GU
  • Android unity3d 加载界面

    2012-08-18 14:10:24
    var str: String; var imageTexture :Texture; private var imageWidth ;int; private var imageHeight ;int; private var screenWidth ;int; private var screenHeight ;int; function Start () { ...scree
  • Android Unity3d 移动脚本

    2012-08-18 14:09:40
    //model speed var TranslateSpeed = 20; //rotate speed var RotateSpeed = 1000; //draw gui function OnGUI()  { //gui background GUI.backgroundColor = Color.red; ...if(GUI.Butto

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,079
精华内容 1,631
关键字:

androidunity3d