Unity C# (1) Variables และ Inspector

Game Development 09 พฤศจิกายน พ.ศ. 2566 422
Home / Articles / 66

สวัสดีครับ ในวันนี้ผมจะพามาแนะนำการเขียน C# เบื้องต้น เพื่อนำไปปรับใช้ในการเขียน Script ต่างๆ ให้กับเกมที่สร้างด้วย Unity Engine

แนวคิดเบื้องหลังของ Game Engine

Game Engine ทั้งแบบ 2D และ 3D จะมี หลักการทำงานอยู่ สองฟังก์ชั่น ได้แก่ Start() และ Update() โดยที่ เริ่มแรก ใน เฟรมที่ 1 เกมจะมีการเรียกใช้ฟังก์ชั่น Start() หนึ่งครั้ง และในเฟรมถัดๆ ไป จะเรียกใช้ฟังก์ชั่น Update() ไปเรื่อย ๆ จนกว่าเกมจะหยุดทำงานลง

ในการใช้ประโยชน์จาก สองฟังก์ชั่นนี้ ผู้พัฒนาเกม (Game Developer) จะใช้ฟังก์ชั่น Start() ในการกำหนดค่าเริ่มต้นให้กับสิ่งต่าง ๆ ในเกมก่อนเกมจะถูกเล่นจริง และในฟังก์ชั่น Update() ซึ่งจะทำงานซ้ำไปเรื่อย ๆ Dev ก็จะใช้ฟังก์ชั่นนี้ในการดำเนินการภายในเกมทั้งหมด การเดินไปยังจุดต่างๆ ใน Map เป็นต้น ความถี่ในการเรียกใช้งานก็จะขึ้นอยู่กับความความไวของ GPU, CPU ที่รันเกมอยู่นั่นเอง เกิดเป็นสิ่งที่เราเรียกว่า เฟรมเรท (Framerates) ยิ่งคอมแรง ก็ยิ่งทำให้เกมดูลื่นไหลมากขึ้น

ตำแหน่งของสิ่งต่างๆ (GameObject) จะถูกอ้างอิงอยู่ในพื้นที่ ที่อ้างอิงไปยังตำแหน่งต่างๆ ด้วยค่าของ แกน x y และ z ในกรณีที่เป็นเกม 3D ส่วนเกม 2D ก็จะมีการอ้างอิงตำแหน่งเพียงแกน x และ y

โครงสร้างใน Unity Script

ทุกๆ ไฟล์ .cs ที่เราจะเขียนเพื่อจะควบคุมการทำงาน ต่างๆ นั้นจะต้องเป็นไปตามโครงสร้างตามแบบของ Unity Tempate ซึ่งจะมีโครงสร้างดังนี้

using UnityEngine;
using System.Collections;

public class MyScript : MonoBehaviour {

	void Start () {
	
	}
	
	void Update () {
	
	}
}

คำสั่ง using คือการ Import ไฟล์ Libraries ต่างๆ เข้ามาทำงานในไฟล์ Script ที่เราสร้าง

MyScript.cs เป็นตัวอย่างไฟล์ที่ผมสร้าง ชื่อไฟล์นี้ถูกนำไปใช้เป็นชื่อ Class ซึ่งมีประโยชน์คือ เราจะสามารถเรียกใช้ แก้ไข ตัวแปร ต่างๆ ภายในไฟล์ MyScript.cs ได้ จากไฟล์ scripts อื่นๆ

ฟังก์ชั่น Start() คือ ฟังก์ชั่นที่จะทำงานเพียง "หนึ่งรอบ" ในเฟรมแรกที่เริ่มเกม เราจะใช้ฟังก์ชั่น Start() ในการ เช็ตค่าพื้นฐานต่างๆ เช่น สถานะเริ่มต้นของ UI เป็นต้น

ฟังก์ชั่น Update() คือ ฟังก์ชั่นที่จะถูกเรียกใช้ในทุกๆ เฟรม เราจะใช้ฟังก์ชั่น Update() ในการทำทุกอย่างในเกม เช่น การเพิ่ม จัดการค่า ในตัวแปรต่างๆ เป็นต้น

Variables / Fields

เวลาที่เราสร้างตัวแปรประเภท "public" ความหมายคือ ตัวแปรที่สามารถเข้าถึงได้โดย Script ต่างๆ นอกเหนือจากภายใน Script แตกต่างจากตัวแปรแบบ private ที่จะสามารถ เข้าถึงข้อมูลในตัวแปรได้แค่ภายในไฟล์ script นั้นๆ เท่านั้น

แบบด้านล่างเป็นตัวแปรประเภท public เมื่อเราไปดูใน Unity Editor ใน Tab "Inspector" จุดที่เรา Import Script เข้าไป จะเกิด Fields ขึ้น เป็นช่องสำหรับใส่ข้อมูล แต่หากใช้ตัวแปรแบบ private จะไม่เกิด Fields ให้ใส่ข้อความขึ้น

หากต้องการให้ private variables มี Field ให้เราสามารถใส่ค่าลงไปได้ จะต้องใส่ [SerializeField] เข้าไปหน้าตัวแปร ใน Unity Inspector ก็จะเกิด Field ขึ้นมา เหมือนกับตัวแปรแบบ public แต่ต่างกันตรงที่คุณสมบัติของตัวแปร

using UnityEngine;
using System.Collections;

public class MyScript : MonoBehaviour {

    public int mynumber;
    public string mystring;
    public bool mybool;
    public int[] mynumber_arr;
    public string[] mystring_arr;
    
    private string secret_str;
    [SerializeField] private string show_in_field_str;
    
    void Start () {

    }
	
    void Update () {

    }
}

การเรียกใช้ แก้ไข ตัวแปรข้ามไฟล์

ในการเรียกใช้ตัวแปรข้ามไฟล์จะมีอยู่สองกรณี กรณีแรกคือไฟล์ Scripts ทั้งสองอัน อยู่ใน GameObject เดียวกัน และกรณีที่สองคือ อยู่คนละ GameObject กัน

สมมุติว่าเดิมแล้วผมมีไฟล์ MyScript.cs โดยไฟล์นี้จะอยู่ใน GameObject ชื่อ "Script1" และผมจะสร้างไฟล์ใหม่ขึ้นมา ชื่อ SecondScript.cs โดยไฟล์นี้จะอยู่ใน GameObject ชื่อ "Script2" ซึ่งอยู่คนละ GameObject กัน แต่ผมต้องการจะเรียกใช้ตัวแปร mybool ในไฟล์ MyScript.cs ออกมาใช้ในไฟล์ SecondScript.cs ผมจะต้องเขียนดังนี้

using UnityEngine;
using System.Collections;

public class SecondScript : MonoBehaviour {

    public GameObject Script1;
    public bool mybool;

    void Start () {
        mybool = Script1.GetComponent<MyScript>().mybool;
    }
	
    void Update () {
    
    }
}

ในการสร้างตัวแปร public GameObject Script1; จุดที่ Script อยู่ ใน Tab Unity Inspector จะเกิด Field สำหรับ GameObject ให้เราเลือกใส่ ให้เราดึง Object "Script1" ที่อยู่ใน Scene ซึ่งมีไฟล์ MyScript.cs เปิดใช้อยู่ เข้ามาก่อน จึงจะสามารถดึงข้อมูลตัวแปรต่างๆ ออกมาได้

หรือ หากผมต้องการจะแก้ไขตัวแปร mybool ที่อยู่ในไฟล์ MyScript.cs จาก SecondScript.cs ก็สามารถทำได้

using UnityEngine;
using System.Collections;

public class SecondScript : MonoBehaviour {

    public GameObject Script1;

    void Start () {
        Script1.GetComponent<MyScript>().mybool = true;
    }
	
    void Update () {
    
    }
}

หรืออีกกรณี คือ ทั้งสอง Script อยู่ใน GameObject เดียวกัน จะเรียกใช้ โดยเรียกผ่าน gameObject ซึ่งหมายถึง GameObject ปัจจุบันที่ Script อยู่ จะเขียนดังนี้

using UnityEngine;
using System.Collections;

public class SecondScript : MonoBehaviour {

    void Start () {
        gameObject.GetComponent<MyScript>().mybool = true;
    }
	
    void Update () {
    
    }
}

อ้างอิง: https://docs.unity3d.com/ScriptReference

Profile Picture.
  • Name (Pen name): Sunny Jirakit (Sunny420x)
  • Study: Bachelor Degree of Computer Science from Chiang Mai Rajabhat University
  • Personality: Architect (INTJ-T)
  • Experience: JavaScript,  Angular.js, React.js, Next.js  Express.js, Unity C#, Socket.io