DEV Community

armariya
armariya

Posted on • Originally published at Medium on

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

สวัสดีครับ กลับมาอีกครั้งกับการเขียน 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.kt

package 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.cs

using 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 ไว้ด้านล่างนี้ได้เลยนะครับ :)

Top comments (0)