请选择 进入手机版 | 继续访问电脑版
查看: 1475|回复: 0

[Android教程] unity3d与android交互

3万

主题

3万

帖子

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
100197
发表于 2016-12-27 19:12:23
简述
实现unity3d导出到android studio工程并封装为library,供其他工程导入module直接使用。
最终效果:
  • 点击ZoomIn、ZoomOut的按钮,通过android端调用unity中方法,进行放大放小;
  • 触摸unity中的3D立方体,调用android端的ShowDialog方法显示原生的dialog。
最近看了下unity3d,关于unity3d和android端的交互参考了一些资料进行测试,现简单总结记录,同时以供参考。
软件版本如下:
unity3d:5.5.0f3
android studio:2.2
具体操作步骤1、在场景中添加一个简单的立方体Cube,加入以下测试用的脚本
  1. using UnityEngine;
  2. using System.Collections;

  3. public class CubeScripts : MonoBehaviour {

  4.     /// 定义旋转速度
  5.     public float RotateSpeed=45;

  6.     /// 定义摄像机的最近距离   
  7.     private float mNear=2.5F;

  8.     /// 摄像机当前距离
  9.     private float mDistance=5F;

  10.     /// 定义摄像机的最远距离
  11.     private float mFar=7.5F;

  12.     /// 摄像机的缩放速率
  13.     private float mZoomRate=0.5F;

  14.     /// 主摄像机
  15.     private Transform mCamera;

  16.     /// 在Start()方法中我们设定了游戏体的名称,因为我们在
  17.     /// Android项目中需要用到这个名称,同时获取主相机对象
  18.     void Start ()
  19.     {
  20.         this.name="Main Cube";
  21.         mCamera=Camera.main.transform;
  22.     }

  23.     /// 在Update()方法中我们让Cube按照一定的速度进行旋转
  24.     void Update ()
  25.     {
  26.         transform.Rotate(Vector3.up * Time.deltaTime * RotateSpeed);
  27.     }

  28.     /// 定义一个放大的方法供外部调用
  29.     public void ZoomIn()
  30.     {
  31.         mDistance-=mZoomRate;
  32.         mDistance=Mathf.Clamp(mDistance,mNear,mFar);
  33.         mCamera.position=mCamera.rotation * new Vector3(0,0,-mDistance)+transform.position;
  34.     }

  35.     /// 定义一个缩小的方法供外部调用
  36.     public void ZoomOut()
  37.     {
  38.         mDistance+=mZoomRate;
  39.         mDistance=Mathf.Clamp(mDistance,mNear,mFar);
  40.         mCamera.position=mCamera.rotation * new Vector3(0,0,-mDistance)+transform.position;
  41.     }

  42.     /// 触摸立方体,调用android端的ShowDialog方法
  43.     void OnMouseDown()
  44.     {
  45.         ZoomOut();
  46.         Debug.Log("MOUSE DOWN");

  47.         using (AndroidJavaClass jc = new AndroidJavaClass("com.oden.u2as.UnityPlayerActivity"))
  48.         {
  49.            // jc.CallStatic("ShowDialog");
  50.             jc.CallStatic("ShowDialog", "str");
  51.         }

  52.     }

  53. }
复制代码
2、导出android studio工程
注意修改包名
导出后工程加入以下方法:
为unity工程中预先设置好的调用方法
  1. public static void ShowDialog(final String string) {
  2.         UnityPlayer.currentActivity.runOnUiThread(new Runnable() {
  3.             @Override
  4.             public void run() {
  5.                 Log.d("SYD", "ShowDialog: " + string);
  6.                 AlertDialog.Builder builder = new AlertDialog.Builder(UnityPlayer.currentActivity)
  7.                         .setMessage("哈哈哈这是Android的原生弹窗")
  8.                         .setPositiveButton("确定", new DialogInterface.OnClickListener() {
  9.                             @Override
  10.                             public void onClick(DialogInterface dialog, int which) {
  11.                                 UnityPlayer.UnitySendMessage("Camera", "NativeTipClosed", "");
  12.                             }
  13.                         });
  14.                 builder.show();
  15.             }
  16.         });
  17.     }
复制代码
3、将导出的工程设置为library
apply plugin: 'com.android.library'
注:遇到报错解决记录:
4、其他工程import该module5、其他工程中需要用到该3D效果的activity继承UnityPlayerNativeActivity
  1. public class MainActivity extends UnityPlayerNativeActivity {
  2.     private Button BtnZoomIn, BtnZoomOut;

  3.     @Override
  4.     protected void onCreate(Bundle savedInstanceState) {
  5.         super.onCreate(savedInstanceState);
  6.         setContentView(R.layout.activity_main);
  7.         //获取显示Unity视图的父控件
  8.         LinearLayout mParent = (LinearLayout) findViewById(R.id.UnityView);
  9.         //获取Unity视图
  10.         View mView = mUnityPlayer.getView();
  11.         //将Unity视图添加到Android视图中
  12.         mParent.addView(mView);

  13.         //放大
  14.         BtnZoomIn = (Button) findViewById(R.id.BtnZoomIn);
  15.         BtnZoomIn.setOnClickListener(new View.OnClickListener() {
  16.             @Override
  17.             public void onClick(View arg0) {
  18.                 UnityPlayer.UnitySendMessage("Main Cube", "ZoomIn", "");
  19.             }
  20.         });
  21.         //缩小
  22.         BtnZoomOut = (Button) findViewById(R.id.BtnZoomOut);
  23.         BtnZoomOut.setOnClickListener(new View.OnClickListener() {
  24.             @Override
  25.             public void onClick(View arg0) {
  26.                 UnityPlayer.UnitySendMessage("Main Cube", "ZoomOut", "");
  27.             }
  28.         });
  29.     }

  30. }
复制代码




回复

使用道具 举报