Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
製作 Unity Plugin for Android
Search
Johnny Sung
September 25, 2014
Technology
0
220
製作 Unity Plugin for Android
製作 Unity Plugin for Android
自從上次講的iOS版本了之後,不講一下Android怎麼可以XD
2014.09.25 @ Android Taipei
Johnny Sung
September 25, 2014
Tweet
Share
More Decks by Johnny Sung
See All by Johnny Sung
用 Gemma 3 開放模型來解決企業難解的問題 @ COSCUP 2025
j796160836
0
8
[GDG Build with AI] 善用現代 AI 科技:打造專屬行銷工具箱 @ GDG Changhua 彰化
j796160836
0
16
Kubernetes 地端自建 v.s. GKE,哪個更適合你? @Devfest Taipei 2024
j796160836
0
54
地端自建 Kubernetes (K8s) 小宇宙 (On-premises Kubernetes) @ CNTUG 2024/11 Meetup #63
j796160836
0
41
[AI LLM] Gemma 初體驗 @ GDG Cloud Taipei Meetup #70
j796160836
0
36
ArgoCD 的雷 碰過的人就知道 @TSMC IT Community Meetup #4
j796160836
0
100
使用 Kong 與 GitOps 來管理您企業的 API 呼叫 @ 2024 台灣雲端大會
j796160836
0
77
[AI / ML] 用 LLM (Large language model) 來整理您的知識庫 @ Devfest Taipei 2023
j796160836
0
230
[Flutter] Flutter Provider 看似簡單卻又不簡單的狀態管理工具
j796160836
0
44
Other Decks in Technology
See All in Technology
プラットフォーム転換期におけるGitHub Copilot活用〜Coding agentがそれを加速するか〜 / Leveraging GitHub Copilot During Platform Transition Periods
aeonpeople
1
160
20250910_障害注入から効率的復旧へ_カオスエンジニアリング_生成AIで考えるAWS障害対応.pdf
sh_fk2
3
260
Modern Linux
oracle4engineer
PRO
0
140
スマートファクトリーの第一歩 〜AWSマネージドサービスで 実現する予知保全と生成AI活用まで
ganota
2
230
いま注目のAIエージェントを作ってみよう
supermarimobros
0
320
5分でカオスエンジニアリングを分かった気になろう
pandayumi
0
250
dbt開発 with Claude Codeのためのガードレール設計
10xinc
2
1.3k
LLM時代のパフォーマンスチューニング:MongoDB運用で試したコンテキスト活用の工夫
ishikawa_pro
0
150
ブロックテーマ時代における、テーマの CSS について考える Toro_Unit / 2025.09.13 @ Shinshu WordPress Meetup
torounit
0
130
Django's GeneratedField by example - DjangoCon US 2025
pauloxnet
0
150
Generative AI Japan 第一回生成AI実践研究会「AI駆動開発の現在地──ブレイクスルーの鍵を握るのはデータ領域」
shisyu_gaku
0
300
Evolución del razonamiento matemático de GPT-4.1 a GPT-5 - Data Aventura Summit 2025 & VSCode DevDays
lauchacarro
0
210
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
31
2.2k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.1k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.1k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
Side Projects
sachag
455
43k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
Designing Experiences People Love
moore
142
24k
Making the Leap to Tech Lead
cromwellryan
135
9.5k
Transcript
製作 Unity Plugin for Android Johnny Sung 2014.09.24 @ Android
Taipei
荈䖰$PDPB)FBE5BJQFJ ⴕ ٰڅù ❧ ٹډö ✫⛓䖕
ّ∣ὕ҂ấĆ ሱ࠭ᾣ
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
Agenda 6OJUZۀ∻ᾏࢺ (BNF0CKFDU $PNQPOFOU "OESPJE1MVHJOℯቔ "OESPJEࢤ१ $ࢤ१ ẵσյЇ٢ᇂ֥ᇿၩ൙⇊
6OJUZ僽➊랃 %䵔↰ႄౣ ္ॖၛ⇔%(BNF ಆ౯"QQ䵔↰㍇Ⴈ +BWB4DSJQU$#00 ቨℸル֥ॴ https://unity3d.com/unity/multiplatform http://www.moneydj.com/kmdj/news/NewsViewer.aspx?a=f4767522-2281-4d16-8ed0-99c6acb797f8
X .POPEFWFMPQ
6OJUZ涸嚌䙂 GameObject Component
GameObject GameObject
GameObject Component
♧⦐瑠涯涸$PNQPOFOUꟀ鸏垺 using UnityEngine; using System.Collections; public class testComponent :
MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } }
.POP#FIBWJPVS涸欰ㄐ鹋劍 "XBLF ⶾ鸤儘ⴲ㨥⻋ 4UBSU 㛂遤儘ⴲ㨥⻋ 6QEBUF 粭㕮鶬㕖 ⣜佪腋罜㹁⢿GQT 'JYFE6QEBUF
暟椚鶬㕖
None
http://docs.unity3d.com/ScriptReference/
C# AndroidJavaClass AndroidJavaObject Java Java UnitySendMessage() C# (對應的接⼝口) (Unity Engine)
(Native) 6OJUZ1MVHJO涸ㄎ〭倰䒭
"OESPJE畮彋⪔ 倞"OESPJEQSPKFDU 䒸欽DMBTTFTKBS PQUJPOBM 之㻨玑䒭
/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)
6OJUZㄎ〭"OESPJE涸侸 AndroidJavaClass AndroidJavaObject
h"p://docs.unity3d.com/ScriptReference/AndroidJavaObject.html
AndroidJavaObject Call() CallStatic() Get() GetStatic() SetStatic()
h"p://docs.unity3d.com/ScriptReference/AndroidJavaObject.Call.html
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 + "]"; } ! } ♧⦐矦㋲涸眕⢿
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# ♧⦐矦㋲涸眕⢿
try { UnityPlayer.UnitySendMessage(gameObject, method, message); } catch(Exception e) { Log.e("Unity",
"UnitySendMessage failed" + e.getMessage()); } ꡠ倴6OJUZ4FOE.FTTBHF GameObject Name Method Name Parameter
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
《䖤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
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
糒䪭㸐 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); } ! }
<?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
䩧⺫㛂遤
"OESPJE畮䩧⺫ 鱒ⴀ 玑䒭焺鱒ⴀ䧭KBS "OESPJE.BOJGFTUYNM 须彂墂呪
None
յЇ℻ԛ Assets! Plugins! Android! bin! MyJar.jar! res! drawable-hdpi! drawable-ldpi! …!
layout! values! AndroidManifest.xml
յЇ℻ԛ 6OJUZ晝劥⟃♳佅䴂 ⴀ"OESPJE㼠呪
Q and A
Thanks!
佞♳"TTFU4UPSF风㢫䘰
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/
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
ꡠ倴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
Unity∣Ⴈ‴თ https://www.facebook.com/groups/581769871867384 想做遊戲?