วันเสาร์ที่ 13 มิถุนายน พ.ศ. 2558

แชร์ไฟล์โปรเจค : เขียน AI บอตคลั่งวิ่งไล่

ไฟล์โปรเจคจากคลิปสอน "เขียน AI บอตคลั่งวิ่งไล่"
ไฟล์โปรเจคก่อนทำ [คลิกที่นี่]
ไฟล์โปรเจคหลังทำ [คลิกที่นี่]

วันพุธที่ 13 พฤษภาคม พ.ศ. 2558

แชร์ไฟล์โปรเจค : เกมตอบคำถาม

ไฟล์โปรเจคจากคลิปสอน "ทำเกมตอบคำถามง่ายๆ ด้วย Unity 5 UI"
[โหลดตรงได้จาก mediafire] คลิกที่นี่
[ดูคลิป] คลิกที่นี่

วันจันทร์ที่ 30 มีนาคม พ.ศ. 2558

แชร์โค้ด Unity : การหยุดเกมด้วย timeScale


การหยุดเกมทำได้หลายวิธี บางคนเขียนโค้ดเทพ อาจจะเขียนโค้ดเพื่อสั่งหยุดการทำงานขงสคริปทุกตัวในออบเจกทุกตัวได้ แต่สำหรับเบื้องต้นมีวิธีง่ายๆอยู่เหมือนกันแต่อาจจะมีข้อจำกัดบ้างซึ่งผมจะพูดถึงทีหลัง



วิธีที่เราจะใช้ในโค้ดนี้คือการปรับค่าของตัวแปร Time.deltaTime ซึ่งเป็นตัวแปรที่ควบคุมการคำนวณที่อ้างอิงเวลา(ความเร็ว)ภายในเกมนั่นเองได้แก่พวก rigidbody และคำสั่งที่มีการคูณ Time.deltaTime ภายในโค้ด โดยตามปกติค่านี้จะอยู่ที่ 1.0 ถ้าเราปรับเป็น 0.5 เกมก็จะช้าลงครึ่งนึง ถ้าปรับเป็น 2.0 เกมจะเร็วสองเท่า แต่สำหรับโค้ดตัวนี้จะเซตค่าให้เท่ากับ 0.0 เพื่อเป็นการหยุดเกมครับ ใครขี้เกียจอ่านก็ดูในคลิปได้เลยครับ

วันเสาร์ที่ 28 มีนาคม พ.ศ. 2558

การเชคปุ่มที่ถูกกดว่าเป็นปุ่มอะไร

     เกมส่วนใหญ่เรามักจะกำหนดเองว่าจะให้ผู้เล่นกดปุ่มไหนเพื่อทำแอคชั่นอะไร
เช่น w a s d เพื่อเดิน spacebar เพื่อกระโดด แต่สำหรับบางเกมเราต้องคอยเชคว่าผู้เล่นกดปุ่มไหนเพื่อนำไปเชคว่าผู้เล่นกดถูกปุ่มหรือเปล่า เช่นเกมแนวกดตาม เกมพิมดีด เกมเต้น


     ที่นี้ตามปกติในเกมประเภทแรกเราจะใช้ Input.GetKey("a") ในการเชคว่าเอ้ะมีการกดปุ่ม A ในเฟรมนี้มั้ยส่วนในเกมประเภทหลังที่พูดถึงถ้าจะทำแบบเดียวกันจะต้องไล่เชคปุ่มบนคีบอร์ดที่มีเป็นร้อยปุ่ม(มั้ง) เปลืองทั้งเวลาและทรัพยากรณ์ CPU เพราะฉะนั้นปกติเราจะใช้ Event ในการเชคกันครับ

วันเสาร์ที่ 31 มกราคม พ.ศ. 2558

แชร์โค้ด Unity : แสดงผลกราฟคลื่นเสียง (Sound Wave Visualizer) - AudioSource.GetOutputData()



พอดีช่วงนี้กำลังทำโปรเจคโครงงานวิชาฟิสิกส์เกี่ยวกับคลื่นเสียงอยู่
ผมเลยเขียนโปรแกรมด้วย Unity เพื่อใช้ประโยชน์ในการนำเสนองาน
ซึ่งผมจะเอาส่วนนึงมาแชร์ เป็นการนำข้อมูลของกระแสเสียงที่ออกผ่านลำโพง
( ดึงค่าจาก audio.GetOutputData() ) มาแสดงผลเป็นกราฟของเสียง
ด้วย Component LineRenderer

การใช้งาน เดี๋ยวจะทำคลิปตามทีหลังนะครับ
ที่จริงลองไปเล่นดูก่อนได้ครับ มีตัวแปรให้ปรับสองสามตัว
จะเป็นพวกขนาด visualizer และก็ความละเอียดของกราฟครับ

ส่วนหน้าตาของโค้ดก็ประมาณนี้ครับ
รายละเอียดติดตามภายในคลิปนะครับ(เสร็จแล้วจะลงเพจอีกที)


รายละเอียดเพิ่มเติมในคลิปครับ


โค้ดดิบสำหรับก้อบ

using UnityEngine;
using System.Collections;

public class soundWave : MonoBehaviour
{
    public LineRenderer lineRend;
    public int quality = 50;
    public float len = 25;
    public float amplitude = 20;
    
    void Update () 
    {
        float[] soundBit = new float[quality];
        lineRend.SetVertexCount(quality);
        
        if (audio.isPlaying)
        {
            for (int i = -quality / 2i < quality / 2i++)
            {
                audio.GetOutputData(soundBit0);
                lineRend.SetPosition(i + quality / 2new Vector3(i * (float)((float)len / (float)quality), soundBit[i + quality / 2] * amplitude0));
            }
        }
    }
}


วันเสาร์ที่ 17 มกราคม พ.ศ. 2558

แชร์โค้ด Unity : การตรวจจับวัตถุของ BOT

โค้ดนี้ได้ทำคลิปสอนวิธีการใช้งานคร่าวๆไว้ใน Youtube ครับ
ตัวโค้ดค่อนข้างยาวเลยขอแปะรูปไว้ให้อ่านกันง่ายๆนะครับ



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



using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class botVision : MonoBehaviour 
{
    public float range = 5;
    public float angleRange = 45;
    public int resolution = 10;

    public List<GameObjectseeingObj = new List<GameObject>();

    float angle = 0;

    void Update () 
    {
        seeingObj.Clear();

        for (int ct1 = 0ct1 < resolutionct1++)
        {
            for (int ct2 = -1ct2 <= 1ct2 += 2)
            {
                int oldListLen = seeingObj.Count;
                bool[] existListHash = new bool[oldListLen];

                angle = angleRange / resolution * ct1 * ct2;
                Ray ray = new Ray(transform.position,new Vector3(Mathf.Sin((angle + transform.eulerAngles.y) * Mathf.Deg2Rad), 0Mathf.Cos((angle + transform.eulerAngles.y) * Mathf.Deg2Rad)));
                RaycastHit hitData;

                if (Physics.Raycast(ray,out hitData,range))
                {
                    if (hitData.collider.gameObject != gameObject)
                        if(seeingObj.Contains(hitData.collider.gameObject) == false)
                            seeingObj.Add(hitData.collider.gameObject);
                }
            }
        }
    }
    
    //DEBUGGING ZONE//
    void OnDrawGizmos()
    {
        for (int ct1 = 0ct1 < resolutionct1++)
        {
            for (int ct2 = -1ct2 <= 1ct2 += 2)
            {
                angle = angleRange / resolution * ct1 * ct2;
                Gizmos.color = Color.yellow;
                Gizmos.DrawRay(transform.positionrange * new Vector3(Mathf.Sin((angle + transform.eulerAngles.y) * Mathf.Deg2Rad), 0Mathf.Cos((angle + transform.eulerAngles.y) * Mathf.Deg2Rad)));
            }
        }
    }
}


#6 สารบัญแชร์โค้ด

วันพุธที่ 31 ธันวาคม พ.ศ. 2557

แชร์โค้ด Unity : เปลี่ยนสี background กล้อง

ใช้ฟังชั่น Color.Lerp() ในการเขยิบค่าสีเดิมของแบคกราวกล้อง ให้ค่อยๆกลายไปเป็นสีใหม่ตามค่าสีที่ใส่ตัวแปร changeTo

การใช้งานให้ทำการใส่ค่าสีที่ต้องการเข้าไปในตัวแปร changeTo
อาจจะสั่งเปลี่ยนสีจากสคริปอื่นหรือตั้งเงื่อนไขการเปลี่ยนสีในสคริปนี้เลยก็ได้

using UnityEngine;
using System.Collections;

public class cameraBG : MonoBehaviour 
{
    public Color changeTo;

    void Update () 
    {
        camera.backgroundColor = Color.Lerp(camera.backgroundColorcurrentColor , Time.deltaTime);    
    }
}

แชร์โค้ด Unity : ตัวหนังสือลอยจาง

เป็นโค้ดควบคุมเอฟเฟกตัวหนังสือให้ลอยขึ้นและจางหายไป
ใช้กับตัวคู่กับวัตถุที่แสดงผลตัวอักษรด้วย TextMesh นะครับ

การใช้งานให้ลากวัตถุใส่ในตัวแปรก่อนจากใน Editor 
ใส่ข้อความที่ต้องการให้แสดงใน  text
ใส่ตำแหน่งที่ต้องการแสดงผลใน  popPos
ใส่สีเริ่มต้นใน startColor (สีจะจางลง)

using UnityEngine;
using System.Collections;

public class floatText : MonoBehaviour
{
    public TextMesh tm;
    public Vector3 popPos;
    public string text;
    public Color startColor;


    float timeCount = 0;

    void Start()
    {
        tm.text = text;
        transform.position = popPos;
        tm.color = startColor;
    }

    void Update () 
    {
        transform.position += Vector3.up *Time.deltaTime;
    
        timeCount += Time.deltaTime;

        if(timeCount > 1)
            tm.color -= new Color(000Time.deltaTime*5f);
    }
}

แชร์โค้ด Unity : เอฟเฟกสีจาง

ใช้วิธีค่อยๆลดค่า alpha ของสีที่อยู่ใน component ที่ควบคุมการแสดงผบของวัตถุนั้นอยู่ สำหรับเกม 3D ปกติจะเป็น mesh renderer สามารถดึงค่าสีได้จาก gameObject.renderer.material.color ส่วนในเกม 2D ที่ใช้ SpriteRenderer จะต้องทำการลากตัวนี้ขึ้นมาใส่เข้ามาก่อนถึงจะปรับเปลี่ยนค่าสีได้

โค้ดนี้ผมใช้บ่อยมากครับ ถ้าใครมีโค้ดที่ดีกว่านี้ก็แนะนำด้วยนะครับ :)

โค้ดสำหรับ 3D ที่ใช้ mesh renderer

using UnityEngine;
using System.Collections;

public class fadeOut3D : MonoBehaviour 

{
    void Update () 
    {
        renderer.material.color -= new Color (000Time.deltaTime);

        //พอสีจางจนมองไม่เห็นก็ Destroy วัตถุ
        if (renderer.material.color.a <= 0)
            Destroy (gameObject);
    }

}


วันอังคารที่ 30 ธันวาคม พ.ศ. 2557

แชร์โค้ด Unity : บอลเด้งขอบจอ

ปัญหาใหญ่ของการทำการเด้งแบบนี้คือถ้าเราใช้การเด้งกับ collider ตามปกติ เราจะไม่รู้ว่าขอบจออยู่ตรงไหนเราเอา collider ไปวางไม่ถูกที่เพราะจอของแต่ละเครื่องมันอัตราส่วนหรือขนาดไม่เท่ากัน เลยเลยใช้คำสั่ง Camera.main.ScreenToWorldPoint() เพื่อหาตำแหน่งขอบจอแล้วนำมากำหนดระยะการเด้งของลูกบอล โค้ดอาจจะยาวๆก็ลองแกะกันดูเนาะ โค้ดส่วนนี้ได้เอาไปใช้งานจริงในเกม Kick it Up! บน Android ก็ลองเล่นกันดูได้

สารบัญแชร์โค้ด

รวมโค้ดทั้งหมดที่แชร์บนบล้อก(6)
กด Ctrl + F เพื่อค้นหาจากชื่อ

ตัวหนังสือลอยจาง
บอลเด้งขอบจอ
เปลี่ยนสี background กล้อง
ส่งตัวแปรข้ามคลาส
เอฟเฟกสีจาง
อักษรลอยจาง
การมองเห็นของบอต
แสดงกราฟคลื่นเสียง

- ENGLISH-
Camera background color transition
Edge bounce
Effect Fade Color
Fade Color
Float Text
Pass variable between class
Bot visible range and get object
Sound wave visualizer


แชร์โค้ด Unity : ส่งตัวแปรข้ามคลาส

ตัวอย่างโค้ดการส่งตัวแปรข้ามคลาส
ส่งตัวแปร score จากคลาส a ไปยังคลาส b1 และ b2 (ใช้คนละวิธีกัน)
หรืออาจจะบอกว่าเป็นการเรียกตัวแปร score จากคลาสอื่นก็ได้

โค้ดตัวแรก class a

using UnityEngine;
using System.Collections;

public class a : MonoBehaviour
{
public int score = 0;

void Update ()
    {
//Do something with score
        score++;
}
}

วันศุกร์ที่ 19 ธันวาคม พ.ศ. 2557

ข้อจำกัดของการทำเกมบน iOS ด้วย Unity



ผมว่าเรื่องข้อจำกัดขอ iOS ไม่ใช่สำหรับเฉพาะคนที่จะทำเกมบน iOS เท่านั้นนะครับ
เพราะวันนึงถ้าคิดเปลี่ยนใจจะมาเพิ่มแพลตฟอร์ม iOS นี้แล้ว ก็จะรู้ว่ามันไม่ใช่งาน
ง่ายๆเลยล่ะครับที่จะทำให้เกมของเราซัพพอร์ต iOS โดยที่ไม่เตรียมมาก่อนหน้า

ข้อมูลส่วนนี้ผมขออนุญาติดึงมาจากเว็บหลัก
ของ Unity มาแปลให้อ่านกันง่ายๆจากต้นฉบับนี้

ฟีเจอร์ต่างๆที่ไม่สามารถใช้งานในแพลตฟอร์ม iOS แบ่งเป็นหัวข้อตามนี้เลยครับ

วันอาทิตย์ที่ 14 ธันวาคม พ.ศ. 2557

[Setup] เตรียมทำเกม Android บน Mac OS X



บทความนี้นะครับ ผมจะมาบอกขั้นตอนการเตรียมเครื่องมือที่จำเป็นสำหรับการ Build เกมจาก Unity ลงใน Android ด้วยเครื่อง Mac นะครับ (ฉบับมือใหม่แกะกล่องเพราะผมเองก็พึ่งแกะ)

วันอาทิตย์ที่ 21 กันยายน พ.ศ. 2557

สอน Unity : มาทำเกมกันเถอะ [Gunner Dodger]



เกม 2D แนว Surviving&Shooting วิ่ง หลบ ยิ่ง มุมมอง TopView
Tutorial ตอนนี้มีทั้งหมด 3 Part (ยังไม่เสร็จ) เกมหน้าตาเป็นยังไง คลิก

วันศุกร์ที่ 23 พฤษภาคม พ.ศ. 2557

[สอน C# for Unity] ตอนที่ 6 : Transform หมุน ขยับ ปรับขนาด



จากตอนที่แล้วได้พูดถึงการดึงค่าตัวแปรและการเรียกใช้งานฟังชั่นจากใน component กันไปเรียบร้อยแล้ว ตอนที่ 6 นี้จะมาสานต่อจากตอนที่ 5 ด้วยการแนะนำ component สุดฮิต Transform ที่ทุก GameObject ต้องมี ให้ทุกท่านได้รู้จักและนำไปใช้กัน

วันจันทร์ที่ 19 พฤษภาคม พ.ศ. 2557

เซฟเกมด้วย PlayerPrefs()



PlayerPrefs() เป็นฟังขั่นอีกตัวนึงที่ Unity ทำเอาไว้ให้ใช้กัน ฟังขั่นตัวนี้จะทำหน้าที่เก็บค่าของข้อมูลเอาไว้ในเครื่อง อย่างใน windows PlayerPrefs จะถูเก็บเอาไว้ใน registry ซึ่งจะไม่หายไปเมื่อปิดเปิดเกมใหม่

จากลักษณะการเก็บข้อมูลทีค้างอยู่ในเครื่องไม่หายไปไหนเมื่อปิดเกม จึงเหมาะมากสำหรับการนำไปทำระบบเซฟเกมแบบออฟไลน์ เช่น เก็บข้อมูลการเล่นว่าผ่านด่านไหนไปบ้างเเล้ว ตอนนี้เลเวลเท่าไหร่ highscore เท่าไหร่ เวลาเปิดเกมก็ดึงค่าเหล่านี้มาอัพเดต ดึง highscore มาเช็คว่าคะแนนที่ทำใหม่มากกว่ารึเปล่าแล้วเซฟคะแนนใหม่ทีสูงกว่าเข้าไปแทนที่คะแนนเดิม

วันพฤหัสบดีที่ 15 พฤษภาคม พ.ศ. 2557

[สอน C# for Unity] ตอนที่ 5 : การเข้าถึง Component



เราใช้สคริปเพื่อเปลี่ยนแปลงค่าและเรียกใช้คำสั่ง(ฟังชั่น)ใน component เพื่อให้เกิด action ต่างๆ,เกิดการเคลื่อนไหว,เปลี่ยนสี ,เล่นเสียง,เอฟเฟกประกอบ ให้ประสานกันกลายเป็นรูปแบบของการตอบสนองของเกม

วันอังคารที่ 13 พฤษภาคม พ.ศ. 2557

[สอน C# for Unity] ตอนที่ 4 : คำสั่งที่เขียนไปทำงานตอนไหน?



ปกติในกานเขียนโปรแกรมธรรมดา จะมีลักษณะการเขียนคำสั่งเป็นชุด แล้วตั้งชื่อให้กลุ่มคำสั่งนั้น
แล้วเรียกใช้จากชื่อ ทำให้ไม่ต้องเขียนคำสั่งยาวๆซ้ำ เราเรียกลักษณะของชุดคำสั่งแบบนั้นว่า function

วันศุกร์ที่ 9 พฤษภาคม พ.ศ. 2557

[สอน C# for Unity] ตอนที่ 3 : สิ่งสำคัญสิ่งสุดท้าย if... else....



เอาละครับ ก่อนจะมาลงมือเขียนสคริปให้เกมของเรา ยังมีอีกอย่างนึงที่จำเป็นมากในการเขียนเกม
นั่นคือเงื่อนไข หรืออาจจะเรียกว่ากฎก็ได้ ว่าถ้าสิ่งไหนเกิดขึ้นเเล้วจะมีอะไรเกิดขึ้นตามมา


  • ถ้าโดนยิง -> ตาย จบเกม
  • ถ้าคลิกโดนและเวลายังไม่หมด -> ได้คะแนน
  • ถ้ากดปุ่ม spacebar -> กระโดด