เบิกเนตรวิธีเขียน Plugin Android บน Unity3d ด้วยไฟล์ Kotlin โดยตรง

qapquiz
3 min readJun 24, 2019

--

สวัสดีครับ กลับมาอีกครั้งกับการเขียน Plugin Android นะครับ หลังจากที่เขียนไปในบล็อกที่แล้ว

เนื่องจากผมเพิ่งได้ไปเห็น Feature หนึ่งที่เขาเขียนไว้ใน Document แต่ไม่มีใครพูดถึงเอาซะเลย เลยถือโอกาสนี้ลองดูครับ ถ้าใครอยากอ่านเต็ม ๆ เข้าที่ https://docs.unity3d.com/Manual/AndroidJavaSourcePlugins.html นี้ได้เลยครับ

หน้าบอก Feature การเอาไฟล์ Kotlin/Java มาทำเป็น Plugin

สำหรับวันนี้จะเป็นการเขียน Plugin ที่เอาไว้สำหรับปริ้นท์​ Toast ขึ้นมาบนหน้าจอ Android นะครับ

Prerequisite

  • Unity3d 2019.2.0b6 (จริง ๆ 2019.1 ก็ได้ครับ แต่พอดีตอนทำใช้เวอร์ชันนี้พอดี)

เริ่มด้วยการสร้างโปรเจคขึ้นมาอันนึงครับ อันนี้ตั้งชื่อว่า ToastDemo เลือกเป็น 2D ก็พอครับ เพราะว่าเราไม่ได้ทำอะไรมาก เสร็จแล้วก็ CREATE โลด

หน้าตาตอนสร้างโปรเจค

หลังจากเข้ามาในโปรเจคนะครับ ไปที่ File -> Player Settings แล้วเลือก Android แล้วกด Switch Platform โลดเลยครับ

Switch Platform เป็น Android

หลังจาก Switch มาเสร็จสรรพ กด Player Settings ข้างซ้ายต่อเลยครับ แล้วเข้าไปที่ส่วนของ Other Settings เพื่อเซ็ต Bundle Identifier ของโปรเจคนี้ก่อนนะครับ อันนี้ผมตั้งไปว่า dev.warpgate.ToastDemo นะครับ (จริง ๆ จะเป็นอะไรก็ได้นะ ไม่ต้องเป็นอันนี้ก็ได้)

เซ็ต Bundle Identifier ของโปรเจ็ค

ต่อไปเราจะมาสร้าง Folder สำหรับเก็บโค้ด Kotlin ก่อนนะครับ โดย***ย้ำสำคัญมาก ๆ เลยนะครับ คือ ห้ามเอาไว้ใน Folder พิเศษของ Unity อันต่าง ๆ นะครับ เพราะว่าถ้าอยู่ใน Folder พิเศษ Unity จะไม่เอาโค้ดเราเข้าไปด้วยนะครับ โดยอันนี้สร้างเป็น Natve/Android นะครับ

Folder structure ของโปรเจค

ทำการเปิดโปรเจคข้างนอกแล้วสร้างไฟล์ Native.kt ได้เลยครับ แล้วทำการเปิด File ขึ้นมาแล้วใส่โค้ดนี้โลด

// Native.ktpackage dev.WarpGate.WarpGate
import android.content.Context
import android.widget.Toast
class Native {
fun toastShort(context: Context, text: String) { Toast.makeText(context, text, Toast.LENGTH_SHORT).show() }
fun toastLong(context: Context, text: String) { Toast.makeText(context, text, Toast.LENGTH_LONG).show() }}

ซึ่งโค้ดนี้ก็คือเป็นโค้ดธรรมดาใน Android ที่เอาไว้ใช้สำหรับการเรียก Toast ขึ้นมาเลยนะครับ สังเกตนะครับว่าชื่อ package ข้างบนนี่จะเหมือนกับของตัว Bundle Identifier เลยนะครับ

หลังที่เขียนเสร็จแล้ว เราจะต้องไปเลือกครับ ว่าจะให้ไฟล์นี้ Import บน Platform ไหนบ้างนะครับ ซึ่งแน่นอนเราจะต้องเลือก Android เพียงอย่างเดียว โดยเราสามารถคลิกที่ไฟล์ แล้วเลือกในหน้าต่าง Inspector ได้เลยครับ

ปรับ Platform ให้เหลือแต่ Android

หลังจากนั้นเราต้องทำการเขียนไฟล์ C# ที่จะไปเรียก Plugin นี้ผ่าน Unity นะครับ ทำการสร้าง Scripts/Native/Native.cs ได้เลยครับผม

สร้างไฟล์ C# ขึ้นมาเพื่อใช้เรียก Plugin

จากนั้นก็ใส่โค้ด Monobehaviour ได้เลยนะครับ

// Native.csusing UnityEngine;public class Native : MonoBehaviour {

private const string m_UnityPlayerClass = "com.unity3d.player.UnityPlayer";
private const string m_NativeClass = "dev.warpgate.ToastDemo.Native";
private const string m_ToastShortMethod = "toastShort";
private const string m_ToastLongMethod = "toastLong";
public void ToastShort(string text) {
using (AndroidJavaClass unityPlayer = new AndroidJavaClass(m_UnityPlayerClass)) {
using (AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) {
using (AndroidJavaObject context = currentActivity.Call<AndroidJavaObject>("getApplicationContext")) {
using (AndroidJavaObject native = new AndroidJavaObject(m_NativeClass)) {
native.Call(m_ToastShortMethod, context, text);
}
}
}
}
}
public void ToastLong(string text) {
using (AndroidJavaClass unityPlayer = new AndroidJavaClass(m_UnityPlayerClass)) {
using (AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) {
using (AndroidJavaObject context = currentActivity.Call<AndroidJavaObject>("getApplicationContext")) {
using (AndroidJavaObject native = new AndroidJavaObject(m_NativeClass)) {
native.Call(m_ToastLongMethod, context, text);
}
}
}
}
}
}

หลังจากนั้นลองเอา Function พวกนี้ไปใส่ในปุ่มแล้ว Build ลง​ Android มาลองได้เลยครับ

หน้าจอตอนใส่โค้ดลงในปุ่มนะครับ

ในที่สุดดด เราก็มาถึงเวลานี้ครับ เย่ พอเทสแล้วก็จะได้แบบนี้นะครับบ

หน้าตา Demo ของผลสำเร็จ

จะเห็นว่า มี Toast ขึ้นมาด้านล่างครับ ถือว่าประสบความสำเร็จอย่างงดงาม เย่

จบไปแล้วนะครับ สำหรับการเขียน Plugin Android ด้วยไฟล์ Kotlin นะครับ ถ้าเกิดว่ามีใครไม่เข้าใจตรงไหน หรือทำตามแล้วไม่ได้ Comment ไว้ด้านล่างนี้ได้เลยนะครับ :)

--

--

qapquiz

Arm | I'm a Game Developer | My dream job is Imagineer!