製作 Unity Plugin for Android

8a6e58b272b266faf22d8a3b2927624f?s=47 Johnny Sung
September 25, 2014

製作 Unity Plugin for Android

製作 Unity Plugin for Android
自從上次講的iOS版本了之後,不講一下Android怎麼可以XD
2014.09.25 @ Android Taipei

8a6e58b272b266faf22d8a3b2927624f?s=128

Johnny Sung

September 25, 2014
Tweet

Transcript

  1. 製作 Unity Plugin for Android Johnny Sung 2014.09.24 @ Android

    Taipei
  2. 荈䖰⿡$PDPB)FBE5BJQFJ ⴕ ٰڅù ❧ ٹډö ✫⛓䖕

  3. ّ∣ὕ҂ấĆ ሱ࠭ᾣ

  4. https://fb.com/j796160836 Johnny Sung Mobile devices Developer https://plus.google.com/+JohnnySung http://about.me/j796160836 Mobile devices

    Developer https://plus.google.com/+JohnnySung http://about.me/j796160836
  5. Agenda 6OJUZۀ୑∻ᾏࢺ (BNF0CKFDU $PNQPOFOU "OESPJE1MVHJOℯቔ "OESPJEࢤ१ $ࢤ१ ẵσյЇ٢ᇂ֥ᇿၩ൙⇊

  6. 6OJUZ僽➊랃 %䵔↰ႄౣ ္ॖၛ⇔%(BNF  ಆ౯"QQ䵔↰㍇Ⴈ +BWB4DSJQU$#00 ቨℸル֥ॴ௜෻ https://unity3d.com/unity/multiplatform http://www.moneydj.com/kmdj/news/NewsViewer.aspx?a=f4767522-2281-4d16-8ed0-99c6acb797f8

  7. X .POPEFWFMPQ

  8. 6OJUZ涸嚌䙂 GameObject Component

  9. GameObject GameObject

  10. GameObject Component

  11. ♧⦐瑠涯涸$PNQPOFOUꟀ鸏垺 using UnityEngine;
 using System.Collections;
 
 public class testComponent :

    MonoBehaviour {
 
 // Use this for initialization
 void Start () {
 
 }
 
 // Update is called once per frame
 void Update () {
 
 }
 }
  12. .POP#FIBWJPVS涸欰ㄐ鹋劍 "XBLF ⶾ鸤儘ⴲ㨥⻋ 4UBSU 㛂遤儘ⴲ㨥⻋ 6QEBUF 粭㕮鶬㕖 ⣜佪腋罜㹁⢿GQT  'JYFE6QEBUF

    暟椚鶬㕖
  13. None
  14. http://docs.unity3d.com/ScriptReference/

  15. C# AndroidJavaClass AndroidJavaObject Java Java
 UnitySendMessage() C#
 (對應的接⼝口) (Unity Engine)

    (Native) 6OJUZ1MVHJO涸ㄎ〭倰䒭
  16. "OESPJE畮彋⪔ Ꟛ倞"OESPJEQSPKFDU 䒸欽DMBTTFTKBS PQUJPOBM  之㻨玑䒭

  17. /Applications/Unity/Unity.app/Contents/ PlaybackEngines/AndroidPlayer/development/bin classes.jar 檔案位置 Mac C:\Program Files (x86)\Unity\Editor\Data\ PlaybackEngines\androidplayer\development\bin Windows

    (optional)
  18. 6OJUZㄎ〭"OESPJE涸⿮侸 AndroidJavaClass AndroidJavaObject

  19. h"p://docs.unity3d.com/ScriptReference/AndroidJavaObject.html

  20. AndroidJavaObject Call() CallStatic() Get() GetStatic() SetStatic()

  21. h"p://docs.unity3d.com/ScriptReference/AndroidJavaObject.Call.html

  22. package com.example.unitytest; ! public class Pet { private int id;

    private String name; ! public void setId(int id) { this.id = id; } ! public void setName(String name) { this.name = name; } ! @Override public String toString() { return "Pet [id=" + id + ", name=" + name + "]"; } ! } ♧⦐矦㋲涸眕⢿
  23. AndroidJavaObject obj = new AndroidJavaObject ("com.example.unitytest.Pet");
 obj.Call ("setId", 123);
 obj.Call

    ("setName", "Lucky");
 string str = obj.Call<string> ("toString");
 Debug.Log (str); Pet obj = new Pet(); obj.setId(123); obj.setName("Lucky"); String str=obj.toString(); Log.v("Unity", str); Java C# ♧⦐矦㋲涸眕⢿
  24. try { UnityPlayer.UnitySendMessage(gameObject, method, message); } catch(Exception e) { Log.e("Unity",

    "UnitySendMessage failed" + e.getMessage()); } ꡠ倴6OJUZ4FOE.FTTBHF  GameObject Name Method Name Parameter
  25. C# 䱺佐 ꡠ倴6OJUZ4FOE.FTTBHF  public void CallFromObjC(string message)
 {
 Debug.Log

    (message);
 } MyViewObject.cs try { UnityPlayer.UnitySendMessage("MyGameObject", "CallFromObjC", "hello"); } catch (Exception e) { e.printStackTrace(); } Java ⫄鷑 MyPlugin.java
  26. 《䖤Activity import android.app.Activity; import com.unity3d.player.UnityPlayer; ! public class MyViewPlugin {

    public static Activity getActivity() { Activity a = UnityPlayer.currentActivity; return a; } } public static AndroidJavaClass getActivity ()
 {
 AndroidJavaClass player; player = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
 AndroidJavaObject a; a = player.GetStatic<AndroidJavaObject> (“currentActivity"); return a;
 } C# Java
  27. package com.unity3d.player; ! public class UnityPlayerNativeActivity extends NativeActivity { //

    don't change the name of this variable; referenced from native code protected UnityPlayer mUnityPlayer; ! // Setup activity layout @Override protected void onCreate (Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); ! getWindow().takeSurface(null); setTheme(android.R.style.Theme_NoTitleBar_Fullscreen); getWindow().setFormat(PixelFormat.RGB_565); ! mUnityPlayer = new UnityPlayer(this); if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true)) getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); ! setContentView(mUnityPlayer); mUnityPlayer.requestFocus(); } ! // Quit Unity @Override protected void onDestroy () { mUnityPlayer.quit(); super.onDestroy(); } ! // … UnityPlayerNativeActivity.java
  28. 糒䪭㸐 package com.example.unitytest; ! import android.os.Bundle; ! import com.unity3d.player.UnityPlayerNativeActivity; !

    public class MainActivity extends UnityPlayerNativeActivity { ! @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } ! }
  29. <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.unitytest" android:theme="@android:style/Theme.NoTitleBar" android:versionName="1.0" android:versionCode="1" android:installLocation="preferExternal">

    <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" /> <application android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="false"> <activity android:label="@string/app_name" android:screenOrientation="fullSensor" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen| keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize| smallestScreenSize|fontScale" android:name="com.example.unitytest.UnityPlayerNativeActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" /> </activity> </application> <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="20" /> <uses-feature android:glEsVersion="0x00020000" /> </manifest> AndroidManifest.xml 岤䠑"OESPJE.BOJGFTU
  30. 䩧⺫㛂遤

  31. "OESPJE畮䩧⺫ 鱒ⴀ 玑䒭焺鱒ⴀ䧭KBS "OESPJE.BOJGFTUYNM 须彂墂呪

  32. None
  33. յЇ℻ԛ Assets! Plugins! Android! bin! MyJar.jar! res! drawable-hdpi! drawable-ldpi! …!

    layout! values! AndroidManifest.xml
  34. յЇ℻ԛ 6OJUZ晝劥⟃♳佅䴂 ⻽ⴀ"OESPJE㼠呪

  35. Q and A

  36. Thanks!

  37. 佞♳"TTFU4UPSF风㢫䘰

  38. References Unity Webview https://github.com/gree/unity-webview Building Plugins for Android http://docs.unity3d.com/Manual/PluginsForAndroid.html 藍斯洛‧雜技的雜記:

    Unity3D Plug-in for Android -- Activity 擴展⽅方法 http://lancelotdiary.blogspot.tw/2012/05/unity3d-plug-in-for- android-activity.html 懂點Unity Plugin,替荷包省點錢!(安卓 Android篇) http://www.unityin.com/2013/05/%E6%87%82%E9%BB%9Eunity-plugin%EF%BC%8C %E6%9B%BF%E8%8D%B7%E5%8C%85%E7%9C%81%E9%BB%9E%E9%8C%A2%EF%BC %81%E5%AE%89%E5%8D%93-android%E7%AF%87/
  39. Unity3D研究院之打開Activity與調⽤用JAVA代碼傳遞參數 http://www.xuanyusong.com/archives/667 Unity GPS plugin development tutorial: 
 building a

    Android plugin for Unity with Eclipse and Ant http://www.mat-d.com/site/unity-gps-plugin-development-tutorial- building-a-android-plugin-for-unity-with-eclipse-and-ant/ References
  40. ꡠ倴Android 涸Back ꒳ public class BackKey : MonoBehaviour
 {
 void

    Update() {
 #if UNITY_ANDROID
 if (Input.GetKeyDown(KeyCode.Escape)) {
 Application.Quit(); // Application.LoadLevel("PreviousLevel");
 }
 #endif
 }
 } #BDL꒳剚㼩䥰ⵌ꒳湏涸&TD h"p://answers.unity3d.com/quesBons/25535/android-­‐back-­‐bu"on-­‐event.html
  41. Unity∣Ⴈ‴თ https://www.facebook.com/groups/581769871867384 想做遊戲?