19
Unity3D Plugins Development Guide ChenKaiJung

Unity3D Plugins Development Guide

Embed Size (px)

DESCRIPTION

Introduction to develop a Unity3D plugin

Citation preview

Page 1: Unity3D Plugins Development Guide

Unity3D Plugins Development Guide

ChenKaiJung

Page 2: Unity3D Plugins Development Guide

Plugins Are?

● Libraries of native code written in C, C++, Objective-C….etc

● Allow your game code to call functions from these libraries

Page 3: Unity3D Plugins Development Guide

Why do you need to develop a Plugin?

● Unity3D can’t Do That● Reuse C/C++/Objective-C components● Difficult customize in Unity3D Assets Store● Cross-Device● Cross-Platform● Security Issues

Page 4: Unity3D Plugins Development Guide

Interface?

● Just like call Unmanaged DLL in .NET● Sync

○ Call the functions and get return values● Async

○ Use UnitySendMessage● Name mangling Issue

○ Use extern "C" { }

○ or _ZN·9funtown·7ios·6init·E

Page 5: Unity3D Plugins Development Guide

Plugins for Different Device

● Compile time - iOS#if UNITY_IOS#else#endif

● Compile time - Android#if UNITY_ANDROID#else#endif

Page 6: Unity3D Plugins Development Guide

Plugins for Different Device ● Runtime - iOS

if (Application.platform == RuntimePlatform.OSXPlayer)

● Runtime - Android

if (Application.platform == RuntimePlatform.Android)

Page 7: Unity3D Plugins Development Guide

iOS Plugins

● C# Dll Import[DllImport ("__Internal")] private static extern void iosInit(bool cookie, bool logging, bool status, bool frictionlessRequests);

● C/C++ Native Functions in xxx.mmextern "C" {void iosInit(bool _cookie, bool _logging, bool _status, bool _frictionlessRequests) { [[FbUnityInterface alloc] initWithCookie:_cookie logging:_logging status:_status frictionlessRequests:_frictionlessRequests]; } }

Page 8: Unity3D Plugins Development Guide

iOS Plugins#ifdef __cplusplusextern "C" {#endif

void UnitySendMessage(const char* obj, const char* method, const char* msg);

#ifdef __cplusplus}#endif

Page 9: Unity3D Plugins Development Guide

iOS 3rd Powerful tools ● XCode Editor for

Unity3D○ Post Process Build○ Json Configure

(fixup.projmods)

{ "group": "Facebook", "patches": [], "libs": [ "Facebook/Editor/iOS/FacebookSDK/libfacebook_ios_sdk.a:<group>" ], "librarysearchpaths": [ "Facebook/Editor/iOS/FacebookSDK/" ], "frameworks": [ "Accounts.framework:weak" ], "headerpaths": [ "Facebook/Editor/iOS" ], "files": [ "Facebook/Editor/iOS/FbUnityInterface.mm", "Facebook/Editor/iOS/FbUnityInterface.h" ], "folders": [], "excludes": [ "^.*\\.meta$", "^.*\\.mdown^", "^.*\\.pdf$" ]}

Page 10: Unity3D Plugins Development Guide

iOS Tips

● DO NOT call plugins Pre-Frame● String passing should be encoded by UTF-8● Wrappers your Message and let it easily

encodes and decodes cross language. Ex: JSON,Query String

● Uses XCode Editor for building automation

Page 11: Unity3D Plugins Development Guide

Android Plugins

● C# Dll Import[DllImport ("unityinapppurchase")] private static extern void androidFTInit(bool cookie, bool logging, bool status, bool frictionlessRequests);

● C++ Native Functions in unityinapppurchase.so

extern "C" {void androidFTInit(bool _cookie, bool _logging, bool _status, bool _frictionlessRequests) { LOGD("androidFTInit called"); } }

Page 12: Unity3D Plugins Development Guide

Android Plugins

● C# Load Java ClassftJava = new AndroidJavaClass("tw.com.funtown.unity.FT");ftjava.CallStatic("Init", "");

● Java Classpublic class FT{ public static void init(String params) {

Log.d("FTUnitySDK", "init called with params: " + params); }}

Page 13: Unity3D Plugins Development Guide

Android Plugins

● Overwrite onActivityResultpublic class FTUnityPlayerActivity extends UnityPlayerActivity{ public void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d("FTUnityPlayerActivity", "onActivityResult: requestCode: " + requestCode + ", resultCode:" + resultCode); }}

Page 14: Unity3D Plugins Development Guide

Android Plugins

● Modify your Manifest.xml Automatically<activity android:name="tw.com.funtown.unity.FTUnityPlayerActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="tw.com.funtown.LoginActivity" > </activity>

Page 15: Unity3D Plugins Development Guide

Android Plugins

● Call UnitySendMessage using JNIbool retval=JniHelper::getStaticMethodInfo(t, "com/unity3d/player/UnityPlayer" ,"UnitySendMessage"

,"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");if(retval==false) return;jstring objectStr = t.env->NewStringUTF(obj);jstring methodStr = t.env->NewStringUTF(method);jstring msgStr = t.env->NewStringUTF(msg);t.env->CallStaticVoidMethod(t.classID,t.methodID,objectStr,methodStr,msgStr);jthrowable exception = t.env->ExceptionOccurred();if (exception) {

t.env->ExceptionDescribe();t.env->DeleteLocalRef(exception);t.env->ExceptionClear();

} else {}…..Please delete your allocated resource here

Page 16: Unity3D Plugins Development Guide

Android Tips

● DO NOT call plugins Pre-Frame● Mono garbage collector by using(){..} or xx.

Dispose() in C#● Put your *.jar *.so in

YOUR_PROJECT/Assets/Plugins● Be careful of Android resource conflict

problem

Page 17: Unity3D Plugins Development Guide

Go through OAuth SDK

Page 18: Unity3D Plugins Development Guide

Q & A