วันจันทร์ที่ 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 ในการเชคกันครับ
เช่น 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 / 2; i < quality / 2; i++)
{
audio.GetOutputData(soundBit, 0);
lineRend.SetPosition(i + quality / 2, new Vector3(i * (float)((float)len / (float)quality), soundBit[i + quality / 2] * amplitude, 0));
}
}
}
}
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 / 2; i < quality / 2; i++)
{
audio.GetOutputData(soundBit, 0);
lineRend.SetPosition(i + quality / 2, new Vector3(i * (float)((float)len / (float)quality), soundBit[i + quality / 2] * amplitude, 0));
}
}
}
}
#7 - สารบัญโค้ด
วันเสาร์ที่ 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<GameObject> seeingObj = new List<GameObject>();
float angle = 0;
void Update ()
{
seeingObj.Clear();
for (int ct1 = 0; ct1 < resolution; ct1++)
{
for (int ct2 = -1; ct2 <= 1; ct2 += 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), 0, Mathf.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 = 0; ct1 < resolution; ct1++)
{
for (int ct2 = -1; ct2 <= 1; ct2 += 2)
{
angle = angleRange / resolution * ct1 * ct2;
Gizmos.color = Color.yellow;
Gizmos.DrawRay(transform.position, range * new Vector3(Mathf.Sin((angle + transform.eulerAngles.y) * Mathf.Deg2Rad), 0, Mathf.Cos((angle + transform.eulerAngles.y) * Mathf.Deg2Rad)));
}
}
}
}
#6 สารบัญแชร์โค้ด
ตัวโค้ดค่อนข้างยาวเลยขอแปะรูปไว้ให้อ่านกันง่ายๆนะครับ
สำหรับวิธีการใช้งาน
(ตอนก้อบโค้ดไปวางอย่าลืมเปลี่ยนชื่อไฟล์นะ)
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<GameObject> seeingObj = new List<GameObject>();
float angle = 0;
void Update ()
{
seeingObj.Clear();
for (int ct1 = 0; ct1 < resolution; ct1++)
{
for (int ct2 = -1; ct2 <= 1; ct2 += 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), 0, Mathf.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 = 0; ct1 < resolution; ct1++)
{
for (int ct2 = -1; ct2 <= 1; ct2 += 2)
{
angle = angleRange / resolution * ct1 * ct2;
Gizmos.color = Color.yellow;
Gizmos.DrawRay(transform.position, range * new Vector3(Mathf.Sin((angle + transform.eulerAngles.y) * Mathf.Deg2Rad), 0, Mathf.Cos((angle + transform.eulerAngles.y) * Mathf.Deg2Rad)));
}
}
}
}
#6 สารบัญแชร์โค้ด
สมัครสมาชิก:
บทความ (Atom)