โค้ด Unity สำหรับ หมุนวัตถุ (GameObject) มีหลายวิธีขึ้นอยู่กับว่าคุณต้องการให้การหมุนเป็นแบบไหน นี่คือตัวอย่างที่พบบ่อยและใช้งานได้หลากหลาย:


1. หมุนวัตถุโดยตรง (Transform.Rotate)

วิธีนี้เหมาะสำหรับการหมุนวัตถุอย่างต่อเนื่องหรือหมุนตามแกนที่กำหนด โดยไม่ต้องใช้ฟิสิกส์ (Rigidbody)

C#

using UnityEngine;

public class ObjectRotator : MonoBehaviour
{
    public float rotationSpeed = 50f; // ความเร็วในการหมุน (องศาต่อวินาที)
    public Vector3 rotationAxis = Vector3.up; // แกนในการหมุน (เช่น Vector3.up คือหมุนรอบแกน Y)

    void Update()
    {
        // หมุนวัตถุอย่างต่อเนื่องรอบแกนที่กำหนด
        // Time.deltaTime ทำให้การหมุนราบรื่นและไม่ขึ้นกับ Frame Rate
        transform.Rotate(rotationAxis * rotationSpeed * Time.deltaTime);

        // ตัวอย่างการหมุนรอบหลายแกนพร้อมกัน:
        // transform.Rotate(new Vector3(1, 1, 1) * rotationSpeed * Time.deltaTime);

        // ตัวอย่างการหมุนตามแกนของโลก (World Space)
        // transform.Rotate(Vector3.up * rotationSpeed * Time.deltaTime, Space.World);

        // ตัวอย่างการหมุนตามแกนของวัตถุเอง (Local Space) - เป็นค่าเริ่มต้น
        // transform.Rotate(Vector3.up * rotationSpeed * Time.deltaTime, Space.Self);
    }
}

คำอธิบาย Transform.Rotate:

  • rotationSpeed: กำหนดความเร็วในการหมุนเป็นองศาต่อวินาที
  • rotationAxis: กำหนดแกนที่ต้องการให้วัตถุหมุนรอบ:
    • Vector3.up (0, 1, 0): หมุนรอบแกน Y (เหมือนลูกโลกหมุนรอบตัวเอง)
    • Vector3.right (1, 0, 0): หมุนรอบแกน X
    • Vector3.forward (0, 0, 1): หมุนรอบแกน Z
    • คุณสามารถกำหนดเป็นค่าอื่นๆ ได้ เช่น new Vector3(0.5f, 1f, 0.2f)
  • Time.deltaTime: ทำให้การหมุนเป็นไปอย่างราบรื่น ไม่ขึ้นอยู่กับ Frame Rate ของเกม
  • Space.World vs Space.Self:
    • Space.World: หมุนรอบแกนของโลก (เช่น Vector3.up คือแกน Y ของโลกเสมอ)
    • Space.Self (ค่าเริ่มต้น): หมุนรอบแกนของวัตถุเอง (แกน Y ของวัตถุอาจจะชี้ไปคนละทางกับแกน Y ของโลก หากวัตถุถูกหมุนอยู่แล้ว)

2. หมุนวัตถุไปยังทิศทางที่ต้องการ (Quaternion.Slerp / LookRotation)

วิธีนี้เหมาะสำหรับการหันวัตถุให้ชี้ไปยังจุดเป้าหมาย หรือหันไปในทิศทางที่กำหนดอย่างเป็นธรรมชาติ

C#

using UnityEngine;

public class ObjectLookAtTarget : MonoBehaviour
{
    public Transform target; // วัตถุเป้าหมายที่ต้องการให้หันไปหา
    public float rotationSpeed = 5f; // ความเร็วในการหมุน (ยิ่งค่าน้อยยิ่งหมุนช้าและนุ่มนวล)

    void Update()
    {
        if (target != null)
        {
            // 1. คำนวณทิศทางจากวัตถุนี้ไปยังเป้าหมาย
            Vector3 directionToTarget = target.position - transform.position;

            // ตรวจสอบเพื่อหลีกเลี่ยงข้อผิดพลาดถ้าทิศทางเป็นศูนย์
            if (directionToTarget != Vector3.zero)
            {
                // 2. สร้าง Quaternion (การหมุน) ที่จะทำให้แกน Z ของวัตถุหันไปทางเป้าหมาย
                // Quaternion.LookRotation จะทำให้ transform.forward ชี้ไปยังทิศทางที่กำหนด
                Quaternion targetRotation = Quaternion.LookRotation(directionToTarget);

                // 3. ค่อยๆ หมุนวัตถุจากตำแหน่งปัจจุบันไปยังการหมุนเป้าหมายอย่างนุ่มนวล
                // Quaternion.Slerp (Spherical Linear Interpolation) เหมาะกับการหมุนที่นุ่มนวล
                transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);

                // ทางเลือก: Quaternion.RotateTowards จะหมุนไปหาเป้าหมายด้วยความเร็วคงที่
                // transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, rotationSpeed * 360 * Time.deltaTime);
                // (ต้องคูณ 360 เพราะ Slerp ใช้ค่าระหว่าง 0-1 ส่วน RotateTowards ใช้องศา)
            }
        }
    }
}

คำอธิบาย Quaternion.Slerp / LookRotation:

  • target: กำหนด Transform ของวัตถุเป้าหมายที่คุณต้องการให้วัตถุนี้หันไปหา
  • directionToTarget: คำนวณเวกเตอร์ทิศทางจากตำแหน่งของวัตถุคุณไปยังตำแหน่งของเป้าหมาย
  • Quaternion.LookRotation(directionToTarget): สร้างค่าการหมุน (Quaternion) ที่จะทำให้ด้านหน้าของวัตถุ (transform.forward) ชี้ไปในทิศทางของ directionToTarget
  • Quaternion.Slerp(จาก, ไปยัง, อัตราส่วน): เป็นฟังก์ชันที่ใช้ในการหมุนอย่างนุ่มนวล (interpolates) ระหว่างการหมุนปัจจุบัน (transform.rotation) ไปยังการหมุนเป้าหมาย (targetRotation) โดย rotationSpeed * Time.deltaTime จะเป็น “อัตราส่วน” ว่าในแต่ละเฟรมจะหมุนไปได้มากน้อยแค่ไหน (ค่า 0 คือไม่หมุนเลย, ค่า 1 คือหมุนไปถึงเป้าหมายทันที)

วิธีใช้งานใน Unity:

  1. สร้างสคริปต์ C# ใหม่ (เช่น ObjectRotator หรือ ObjectLookAtTarget)
  2. คัดลอกโค้ด ที่ต้องการไปวางในสคริปต์นั้น
  3. ลากสคริปต์ ไปวางบน GameObject ที่คุณต้องการให้หมุนใน Hierarchy
  4. หากใช้สคริปต์ ObjectLookAtTarget ให้ ลาก GameObject เป้าหมาย (เช่น ตัวละคร, จุดว่างๆ) ไปใส่ในช่อง Target ใน Inspector ของสคริปต์
  5. ปรับค่า Rotation Speed ใน Inspector เพื่อให้ได้ผลลัพธ์การหมุนที่คุณต้องการ

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • เปิดใช้งานตลอด

บันทึกการตั้งค่า