เบิกเนตรวิธีเขียน Plugin Android บน Unity3d ด้วยไฟล์ Kotlin โดยตรง
Tags: unity3d, unity, plugindevelopment, android
Published: 2020-01-28 10:25:35

---
title: เบิกเนตรวิธีเขียน Plugin Android บน Unity3d ด้วยไฟล์ Kotlin โดยตรง
published: true
tags: unity3d,unity,plugin-development,android
canonical_url: 
---

สวัสดีครับ กลับมาอีกครั้งกับการเขียน Plugin Android นะครับ หลังจากที่เขียนไปในบล็อก[ที่แล้ว](https://dev.to/armariya/-plugin-android--unity3d--kotlin--onactivityresult--override-activity--3l8m)

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

![](https://cdn-images-1.medium.com/max/1024/1*Oz2LAWFaRuoNeoN1sTQ-tw.png)<figcaption>หน้าบอก Feature การเอาไฟล์ Kotlin/Java มาทำเป็น Plugin</figcaption>

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

**Prerequisite**

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

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

![](https://cdn-images-1.medium.com/max/1024/1*ucDXCq1BxYx7MBcO3ieYwQ.png)<figcaption>หน้าตาตอนสร้างโปรเจค</figcaption>

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

![](https://cdn-images-1.medium.com/max/1024/1*lTar6YzA4BWnGvbWLb0Few.png)<figcaption>Switch Platform เป็น Android</figcaption>

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

![](https://cdn-images-1.medium.com/max/1024/1*L0HvJp2-HtzxGmfAnNTCIA.png)<figcaption>เซ็ต Bundle Identifier ของโปรเจ็ค</figcaption>

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

![](https://cdn-images-1.medium.com/max/398/1*um7c6cxwVRNQdKox3rRocw.png)<figcaption>Folder structure ของโปรเจค</figcaption>

ทำการเปิดโปรเจคข้างนอกแล้วสร้างไฟล์ 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 ได้เลยครับ

![](https://cdn-images-1.medium.com/max/810/1*lCwtGBKU5dXxQgS-b1tvHg.png)<figcaption>ปรับ Platform ให้เหลือแต่ Android</figcaption>

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

![](https://cdn-images-1.medium.com/max/1024/1*d_j2-qOL7UkD__MwbUG2Aw.png)<figcaption>สร้างไฟล์ C# ขึ้นมาเพื่อใช้เรียก Plugin</figcaption>

จากนั้นก็ใส่โค้ด 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 มาลองได้เลยครับ

![](https://cdn-images-1.medium.com/max/776/1*_yHuKpF_hA8Y64Fj6wb4uw.png)<figcaption>หน้าจอตอนใส่โค้ดลงในปุ่มนะครับ</figcaption>

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

![](https://cdn-images-1.medium.com/max/1024/1*Gxn7S4YcvMZ3cebxuNA5Pw.png)<figcaption>หน้าตา Demo ของผลสำเร็จ</figcaption>

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

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