[UNITY][Particle] Particle ที่เล่น Particle เดิมซ้ำๆ แต่ Random จุดเกิด by

30
Jun
0

เคยไหม ที่อยากให้ Particle เกิดแบบ Random จุดเกิด แต่มีปริมาณตามที่เรากำหนดไว้ตลอด ยกตัวอย่างเช่น ทำ Particle สำหรับ ท่าโจมตีของ Unit ตัวหนึ่งซึ่งเป็นมือปืน เวลาใช้ท่าไม้ตาย Unit ตัวนี้จะโจมตี 6 ครั้งแบบยิงกราด อะไรประมาณนั้น วันนี้จะมานำเสนอ Code ที่จะทำให้ชีวิตง่ายขึ้นครับ

ขั้นแรก เอา Code ไปก่อนเลยครับ

using UnityEngine;
using System;
using System.Collections;
public class ParticleRandomize : MonoBehaviour
{
[Serializable]
public class Range
{
public float Min;
public float Max;
}
public GameObject Particle;
public int Count;
public float Time;
public Range X;
public Range Y;
public float RandomDistancePercent = 100f;
void Start()
{
float TimePerOnce = Time / Count;
Vector2 Distance = new Vector2(Mathf.Abs(X.Min - X.Max) * RandomDistancePercent / 100 / 2, Mathf.Abs(Y.Min - Y.Max) * RandomDistancePercent / 100 / 2);
Vector2 lastPosition = Vector3.zero;
for (int i = 0; i 100)
{
break;
}
} while ((lastPosition.x + Distance.x > x && x > lastPosition.x - Distance.x) && (lastPosition.y + Distance.y > y && y > lastPosition.y - Distance.y));
lastPosition = new Vector2(x, y);
_particle.transform.parent = transform;
_particle.transform.localPosition = new Vector2(x, y);
});
}
}
}

ต่อมาเราก็ AddComponent ให้ Particle ที่เราอยากให้มันเล่นซ้ำๆนะครับ ตัวอย่าง
Untitled

จะอธิบาย Config ใน Inspector ทีละตัวนะครับ
Particle: คือ Particle ที่เราอยากให้เล่นซ้ำๆ ครับ ให้ลาก prefab particle มาใส่ในช่องนี้นะครับ
Count: คือจำนวนครั้งที่อยากให้ Particle เล่นครับ
Time: คือระยะเวลาหน่วงระหว่าง Particle ครับ
X.min: คือระยะน้อยที่สุดในแกน x ที่จะ Random จุดเกิด
X.max: คือระยะมากที่สุดในแกน x ที่จะ Random จุดเกิด
Y.min: คือระยะน้อยที่สุดในแกน y ที่จะ Random จุดเกิด
Y.max: คือระยะมากที่สุดในแกน y ที่จะ Random จุดเกิด
Random Distance Percent: คือ ระยะ(เป็นเปอร์เซนของระยะ min, max ที่ตั้งไว้) ที่จะไม่ให้ Particle เกิดใกล้กันครับ

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

[Unity] ว่าด้วยเรื่อง Audio Compression Format หรือวิธีบีบอัด Audio ให้ไม่กิน Memory ขณะรัน by

30
Apr
0

ปกติแล้วเวลาเราใส่ Audio ต่างๆลงในโปรเจ็คแล้วสั่งเล่น ขณะรันจะพบว่าตัว Audio นั้นกิน Memory มากเกินควร ซึ่งทั้งๆที่ Source Audio ของเรานำเข้ามาเป็น MP3 ขนาดไฟล์ไม่ใหญ่แท้ๆ แต่พอนำเข้ามากลับมีกิน Memory ไปเยอะมากขณะรัน ซึ่งถ้าเรามาย้อนดู Inspect ที่ตัวไฟล์ตั้งแต่แรกนั้นก็จะพบว่า Audio ของเรานั้นมีขนาดมากกว่าตัวไฟล์จริงๆ ซึ่งเกิดจากเจ้า Unity ไม่ว่าจะนำ Audio ใดๆก็ตามเข้ามาจะพยายามแกะให้เป็น Audio ที่ Decompress (ไม่บีบอัดเลย) ขณะรัน ซึ่งก็เหมือนกับเราเอา WAV ไฟล์มาใส่ตรงๆนั่นแหละครับ พอ Decompress ไฟล์ก็จะบานออกทำให้กิน Memory มากขึ้นนั่นเอง เราจึงต้องทำการปรับ Setting ใน Inspect ให้เรียบร้อยก่อนการรันนั่นเองครับ

จากรูปด้านบน ที่ใต้สุดของรูปจะเห็นได้ว่า ขนาดของ Audio ตัวนี้กลายเป็น 10.3 MB ซึ่งขนาดจริงมีเพียง 2.7 MB ซึ่งสิ่งที่เราต้องเช็คคือ Load Type และ Compression Format

ให้เราทำการเปลี่ยน Load Type เป็น Compressed In Memory ซึ่งจะทำงานตามชื่อมันเลยคือจะยัง Compressed (บีบอัด) อยู่เหมือนเดิมเวลาเก็บลง Memory แต่ ถ้าถามว่าอ่าวแล้วไม่มีข้อเสียเลยหรอ มีครับ การที่มันบีบอัดอยู่ใน Memory ก็แปลว่าการรันของมันจะต้องทำการแกะมาอ่านในทุกๆ Sample เสียงแทน ซึ่งจะใช้งาน Process มากขึ้น แต่ถ้าเพื่อแลกกับการทำให้ Memory ล้นจนเกมพัง ก็ยังถือว่าคุ้มครับ

ส่วน Compression Format มัน Default ไว้ที่ Vorbis อยู่แล้วให้ทิ้งไว้แบบนั้นครับ Format อื่นๆ แทบจะไม่ได้ลดขนาดลงเท่าไรเลยครับ และ Quality แนะนำว่าเต็มไว้ดีแล้วครับ ลดลงจากนี้จะทำให้เริ่มฟังออกแล้วว่าคุณภาพเสียงตกลง

เมื่อปรับเรียบร้อย แถ่นแท้นนน 1.8 MB เองครับ

Unity Debugging(1) by

30
Dec
0

เคยไหมเวลามีปุ่มหลายๆปุ่ม หรือมี Collider หลายๆอัน ซ้อนกันอยู่ แล้วเมื่อคลิ๊กหรือกดปุ่ม แล้วไม่โดน Collider หรือปุ่มที่ต้องการ เอ้า ทีนี้จะทำยังไงล่ะ!! วันนี้เลยจะมาบอกวิธีการที่ใช้หาว่าเรากดไปโดน Collider ตัวไหนโดยใช้ RayCast กันครับ

1. ก่อนอื่นเลยให้สร้าง Script แล้วใส่ Method Update ตามนี้

void Update() {
if (Input.GetMouseButtonDown(0)) {
RaycastHit hit;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit))
if (hit.collider != null){
Debug.LogError(hit.collider.name);
}
}
}

2. Add Script ที่เราสร้างใหม่นี้ไปใส่กับ MainCamera ของ Scene นั้นๆ
3. เมื่อเรากดไปโดน Collider ใดๆก็ตาม Script นี้จะพ่นชื่อของ GameObject ที่เรากดไปโดนมาให้ทุกครั้ง แค่นี้เราก็รู้แล้วว่า เรากดไปโดนปุ่ม หรือ Collider ตัวไหนกันแน่ครับ

วิธีการทำลูป JSONClass ของ SimpleJSON [Unity C#] by

31
Oct
1

หลังจากที่ได้รู้จักกับ JSONClass ใน Class SimpleJSON ซึ่งใช้ได้ค่อนข้างสะดวกกว่า Hashtable และ Dictionary มาก (แต่มีเงื่อนไขว่า Child ทั้งหมดเป็นได้แค่ String, Int, Float, Double, Boolean และตัวมันเอง) เนื่องจากสามารถเรียกค่าที่ซ้อนตัวมันเองได้ง่าย เช่น tempJsonClass["key"]["name"] ได้เลยซึ่งถ้าเก็บข้อมูลแบบนี้ไว้ใน Hashtable ล่ะก็ ต้องเรียก tempHashtable["key"] มาใส่ในอีก Hashtable ก่อนถึงจะเรียก key “name” ข้างในอีกทีออกมาได้ ซึ่งมีอย่างหนึงที่ SimpleJSON (จาก Link) ขาดไปคือการเรียก Keys เพื่อใช้ในการวนลูป (ซึ่งจรืงๆ SimpleJSON.cs ปกติมีฟังก์ชั่น GetEnumerator() ที่ Return Keys แต่ว่าเป็น IEnumerator ที่ต้องใช้ StartCouroutine()) เราเลยต้องเพิ่มโค๊ดส่วนหนึ่งเข้าไปใน Class SimpleJSON

เพิ่มโค๊ดด้านล่างนี้เข้าไปใน Class JSONClass ภายใน SimpleJSON.cs (Class อยู่ที่บรรทัด 696)

public Dictionary<string, JSONNode>.KeyCollection Keys{
  get { return m_Dict.Keys; }
}

แค่นี้เราก็สามารถเรียก Keys จาก JSONClass เพื่อมาใช้วน For Loop ได้แล้วล่ะครับ ตัวอย่างดังนี้

 

JSONClass tempJsonClass = SimpleJSON.JSON.Parse(result); //result เป็น String JSON ทั่วๆไป
foreach(string key in tempJsonClass .AsObject.Keys){ //ใช้ .AsObject.Keys เพื่อดึง Key ทั้งหมดได้เลย
  Debug.Log(key+":"+tempJsonClass[key]);
}

ง่ายๆเท่านี้แหละครับ

Google Analytics Plugin for Unity(Both IOS and Android) by

31
Oct
0

วันนี้เราจะมาแนะนำ วิธี Setup และวิธีใช้ Plugin ตัวนึงนะครับ ที่มีประโยชน์มากๆ และใช้ง่ายมากๆ เจ้า Plugin ตัวนี้ก็มีชื่อว่า Google Analytics Plugin for Unity นะครับ ตัวที่เราจะแนะนำนี้เป็น Version 3(Beta) นะครับ

  • ก่อนจะเริ่มคุณก็ต้องมี Google Analytics Account กันก่อนนะครับ ซึ่งเราจะไม่พูดถึงตรงนี้นะครับ- ต่อมาให้ไปโหลดเจ้า Plugin ตัวนี้ ที่นี่ ครับ
  • ถ้าหาก App ของคุณมีการขอ Permission ในการ ใช้ Internet อยู่แล้ว ก็ข้ามขั้นตอนนี้ไปได้เลยนะครับ แต่หากยังไม่มีการขอ Permission ตรงนี้ก็ให้ไปใส่แบบนี้เลยครับ
    • Android
      ให้เอา CODE นี้ไปใส่ใน AndroidManifest.xml ที่/Assets/Plugins/Android/ ข้างบน tag

       

    • IOS
      ให้นำ libraries ข่างล่างนี้ไปใส่ใน Xcode project ของคุณนะครับ:
      AdSupport.framework
      CoreData.framework
      SystemConfiguration.framework
      libz.dylib
      libsqlite3.dylib
  • ลาก prefab ชื่อ GAv3.prefab ที่อยู่ใน Folder Assets/Plugins/GoogleAnalyticsV3 ไปใส่ใน Project.
  • หน้าตา Inspector ของ Prefab GAv3 จะเป็นแบบนี้นะครับ
    Untitled
    จะอธิบายว่าในแต่ละช่องคืออะไร และควรใส่อะไรลงไปบ้างนะครับ

    • Android Tracking Code – คือ Tracking Code ของ Android ครับ ก็ให้ใส่ Tracking Code ที่ได้จาก Google Analytics ครับ ถ้าหากไม่ใส่ และ Build Application ลงไปบน Android มันก็จะไม่มีการ Tracking ครับ
    • IOS Tracking Code – คือ Tracking Code ของ IOS ครับ ก็ให้ใส่ Tracking Code ที่ได้จาก Google Analytics ครับ ถ้าหากไม่ใส่ และ Build Application ลงไปบน IOS มันก็จะไม่มีการ Tracking ครับ
    • Other Tracking Code – คือ Tracking Code ของอื่นๆครับ เช่น PC หรือ Unity Editor ครับ ก็ให้ใส่ Tracking Code ที่ได้จาก Google Analytics ครับ ถ้าหากไม่ใส่มันก็จะไม่มีการ Tracking ครับ
    • Product Name – คือชื่อที่จะไปปรากฏอยู่ใน Google Analytics ครับ
    • Bundle Identifier – ให้ไปเอามาจาก Build Settings ->Player Settings->Other Settings ครับ
    • Bundle Version – ให้ไปเอามาจาก Build Settings ->Player Settings->Other Settings ครับ
    • Dispatch Period – อันนี้ไม่ต้องไปยุ่งกับมันครับ
    • Sample Frequency – อันนี้ไม่ต้องไปยุ่งกับมันครับ
    • Log Level – คือ config ที่จะให้ตัว Plugin มันพ่น Log ออกมาในระดับไหนครับ
      • ERROR – พ่นแต่ Error ครับ
      • WARNING – พ่น Error และ Warning ครับ
      • INFO – พ่น Error, Warning และ Info ครับ
      • VERBOSE – พ่นทุกอย่างในโลกครับ
    • Anonymize IP – ไม่ต้องติ๊กครับ
    • Dry Run – ไม่ต้องติ๊กครับ
    • Session Timeout – เวลาของ Session ครับ ใช้ 1800 แหละดีแล้วครับ
  • สร้าง C# Script ชื่อ และ Copy Code นี้ไปใส่

    public class GoogleAnalytics : MonoBehaviour {

    public static GoogleAnalytics instance;

    public GoogleAnalyticsV3 googleAnalytics;

    void Awake(){
    DontDestroyOnLoad (gameObject);

    instance = this;
    }

    public void LogScreen(string title){
    googleAnalytics.LogScreen(title);
    }
    }

  • ต่อไปเป็นวิธีการใช้นะครับ การใช้ก็ง่ายนิดเดียวครับ ใช้แบบนี้ GoogleAnalytics.instance.LogScreen(“Enter You Tracking String Here”); ครับ
 เราชนะรอบ 4 | ยืมเงิน 3000 ด่วน | แอพกู้เงิน | แอพเงินด่วน | สินเชื่อออนไลน์อนุมัติทันที | Site Map | กู้เงินก้อน | กระเป๋าตัง | thisshop และ ยืมเงินฉุกเฉิน 5000 ด่วน