วันเสาร์ที่ 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 สารบัญแชร์โค้ด