วิธีง่ายๆในการจัดกลุ่มตัวแปรใน Inspector by

26
Jan
0

เมื่อเราต้องการจัดกลุ่มของตัวแปรปกติเราต้องไปยุ่งกับพวก UnityEngine.GUI GUILayout GUIStyle ซึ่งถ้าเราไม่อยากไปวุ่นวายก็มีวิธีง่ายๆโดยใช้การเขียน Class ของตัวแปร ที่มี [Serializable] เอาครับ

ตัวอย่างเช่น เราต้องการตัวแปร 4 ชุด ที่เก็บ GameObject ด้านในคล้ายๆกัน วิธีปกติก็จะได้โค็ดแบบนี้

public GameObject Border4;
public List Piece4;
public List NewPiece4;
public GameObject Border6;
public List Piece6;
public List NewPiece6;
public GameObject Border9;
public List Piece9;
public List NewPiece9;
public GameObject Border12;
public List Piece12;
public List NewPiece12;

ซึ่งหน้าตาใน Inspector จะออกมาแบบนี้ ดูยากมาก

ที่นี้ถ้าเราทำมันเป็น Class ใส่ [Serializable] เข้าไป โค็ดก็จะหน้าตาออกมาเป็นแบบนี้


public Image Image4;
public Image Image6;
public Image Image9;
public Image Image12;
[Serializable]
public class Image
{
public GameObject Border;
public List Piece;
public List NewPiece;
}

ซึ่งผลลัพธ์ที่ออกมาดูง่ายกว่าเดิมมากครับ

วิธีทำให้ปุ่มกดไม่ได้โดยที่ไม่เปลี่ยน Sprite เป็น Disabled by

29
Sep
0

จากบนลงล่าง กดได้ / กดไม่ได้ / กดไม่ได้

จากรูปด้านบน ปกติแล้วปุ่ม UI Button จะมีอยู่ 3 State คือ Normal / Pressed / Disabled ทีนี้ปุ่มที่โชว์ขณะไม่มีแอคชั่นใดๆก็จะมองเห็นได้อยู่สองแบบคือ Normal กับ Disabled แต่โจทย์คือเราอยากได้แบบที่ 3 คือดูเหมือนปุ่มกดได้ (Normal) แต่ว่าจริงๆแล้วกดไม่ได้ เลยมีวิธีแก้โดยใช้โค๊ดดังนี้ฮะ

Set Sprite ไว้ตามปกติ สีขาว Normal / สีแดง Disabled


if (isLock) //ถ้าล็อค
{
buttonTrans.GetComponent<BoxCollider>().enabled = false; //ปิด BoxCollider
button.enabled = false; //Disable ตัวปุ่มไป โดยจะไม่ใช่ .isEnable ที่จะทำให้ปุ่มนั้นเปลี่ยน state เป็น Disabled
}
else //ถ้าปกติ
{
button.isEnabled = true; //เปลี่ยนกลับเป็น Normal
button.enabled = true; //Enable ตัวปุ่ม
buttonTrans.GetComponent<BoxCollider>().enabled = true; //เปิด BoxCollider
}

ตามโค๊ดด้านบนถ้าเรียง Order ผิดก็จะแสดงผลผิดได้ เพราะแค่ Hover ปุ่มก็จะทำการเช็ค State แล้ว แต่ Order ด้านบนสามารถทำให้ได้ผลลัพธ์ตรงตามความต้องการครับ

[C#] วิธีการ Overload ตัว Operator (+ – * / > = <= == !=) by

31
Aug
0

เนื่องจากได้เขียน Class ค่าเงินขึ้นมา ซึ่งทำไว้รองรับปริมาณหน่วยเงินจำนวนมากๆ ทำให้ต้องมีการเขียน Overload พวกตัวคำนวน ตัวเปรียบเทียบทั้งหลายขึ้นมาใหม่ เพราะค่าของค่าเงินไม่ได้เก็บไว้ในตัวแปรเพียงตัวเดียว วิธีการ Overload ก็ไม่ยาก ตัวอย่างดังนี้ฮะ ( Currency เป็นชื่อ Class ใหม่)

Overload ตัวคำนวน +, -, *, /

public static Currency operator +(Currency c1, Currency c2)
{
Currency cResult = new Currency();
/**
คำนวนค่า
*/
return cResult; //ส่งค่ากลับ
}

Overload ตัวเปรียบเทียบ >, <,  >=, <=, ==, !=

public static Currency operator >(Currency c1, Currency c2)
{
if (/* เงื่อนไขใหม่ที่เปรียบเทียบค่า */)
return true;
else
return false;
}

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

การหลีกเลี่ยงการใช้ List แบบ Public ที่ต้องการกำหนดค่าในโค๊ด by

30
Jun
0

เป็นปัญหาที่พบล่าสุด โดยปกติแล้วถ้าเรามีตัวแปร Global ที่อยากให้ไฟล์อื่นเรียกใช้โดยที่ไม่ต้องการแก้ไขใน Inspector ของ Unity เราก็จะสร้างตัวแปร Public ไว้ให้ไฟล์อื่นๆเรียกใช้ โดยเราจะสั่ง  [HideInInspector] ไว้เพื่อไม่ให้มันโชว์ใน Inspector

แต่ทีนี้ตัวแปร List ที่เราสร้างไว้ เรายังสามารถแก้ไขในโค๊ดยังไงก็ได้ แต่ว่าถ้าเมื่อไหร่ตัว GameObject ของเราเข้าไปอยู่ใน Scene ที่ทำการ Save แล้ว ค่านั้นจะถูกแช่ไว้โดย Unity ทำให้ไม่ว่าเราจะแก้ไขในโค๊ดเท่าไรมันจะไม่เปลี่ยนตาม

List ตัวอย่างที่ถูกแก้ไขมาแล้ว

List ไม่โชว์จากคำสั่ง [HideInInspector]

ข้อมูลเมื่อรันจริง จะได้ค่าที่ถูกแช่ไว้โดย Unity ตอนที่เรา Save Scene

วิธีแก้ปัญหาก็มีได้ 2 วิธี
1. สร้างตัวแปรมาไว้ก่อนแล้ว Init ค่าตอน Awake() หรือ Start()
2. วิธีที่ควรจะเป็นคือ ใช้ตัวแปรเป็น  private
ex.
private List TestPublicList = new List()

แล้วถ้าต้องการให้ไฟล์อื่นมาเรียกใช้ก็สร้าง function public มาดึงข้อมูลตัวนี้อีกทีเท่านั้นเอง

ข้อมูลตอนรันหลังจากแก้เป็น private แล้ว

ข้อควรระวังในการใช้ SimpleJSON by

31
May
0

เนื่องจากทีมได้ใช้ SimpleJSON กันมานานระดับนึงแล้ว แต่ก็ยังมีบั๊คโผล่มาจากการเขียนโค้ดเพิ่มอยู่บ้างบางครั้ง จากเจ้า SimpleJSON ซึ่งมันง่ายสมชื่อ จนทำให้การใช้งานมันสร้างบั๊คแบบไม่รู้ตัวได้ง่ายมากๆ คือการ .Asใดๆ ก็ตามของมัน (ie. .AsInt .AsFloat) ที่มันจะสร้างตัวแปรใหม่มากำหนดค่าเริ่มต้นมาให้เลยทั้งๆที่มันไม่มี index นี้อยู่หรือเป็น null ส่วนมากมักเกิดจากการเช็คเงื่อนไข if ทั่วๆไปที่จะชอบเผลอใส่ .AsInt เข้ามา ทำให้มันมีค่าขึ้นมาเองทันที และการเข้าถึงตัวแปรชั้นลึกๆแล้ว .AsInt โดยที่ไม่เช็คก่อนว่ามีหรือเปล่า ก็จะสร้างขึ้นมาให้เช่นกัน และอีกเรื่องคือการเช็คว่าเป็น JSONClass เปล่าๆ หรือ JSONArray เปล่าๆหรือไม่ ถ้าเช็คไม่ครบก็จะผิดเงื่อนไขเอาง่ายๆ

  • เรามาเริ่มที่เรื่องแรกก่อน

สิ่งที่ควรหลีกเลี่ยงเลยคือการใช้ .Asใดๆ (หลังจากนี้จะใช้ .AsInt เป็นหลัก) เพื่อดึงค่าตัวเลขที่เราไม่แน่ใจว่ามี index นี้หรือยัง จะทำให้ข้อมูลผิดพลาด

แบบที่ควรหลีกเลี่ยง

JSONNode test = new JSONClass();
int id = test["id"].AsInt; //จะทำให้ index ที่ชื่อ id เป็น 0 ทั้งๆที่ไม่เคยกำหนดค่ามาก่อน
if (test["number_id"].AsInt >= 0){
//ถ้าเช็คแบบนี้เงื่อนไขนี้จะถูกเสมอเพราะโดนกำหนดค่า 0 ตอน .AsInt
}

สิ่งที่ควรทำ

JSONNode test = new JSONClass();
int id = -1;
if (test["id"] != null)
id = test["id"].AsInt //จะทำให้ id ถูกต้องโดยจะเป็น -1 ถ้าไม่มี index ดังกล่าว
if (test["number_id"] !=null && test["number_id"].AsInt >= 0){
//ถ้าเช็คแบบนี้เงื่อนไขนี้จะไม่พลาดเข้าเงื่อนไขเมื่อไม่ได้กำหนด index number_id มา
}

  • ถัดมาเรื่องการเช็ค JSONArray และ JSONClass เปล่า ทั้งคู่นี้ใช้การเช็ค Empty ต่างกัน

JSONArray testArray = new JSONArray();
//ใช้
if (testArray.AsObject == null)


JSONClass testObject = new JSONClass();
//ใช้
testObject.AsObject != null && testObject.AsObject.Count > 0

จากที่เห็นผิดนิดเดียวก็เกิดบั๊คกระจุยกระจายได้ ดังนั้นระมัดระวังกันด้วยนะครับ SimpleJSON ใช้ง่าย บั๊คก็ง๊ายง่ายเช่นกัน

 เราชนะรอบ 4 | ยืมเงิน 3000 ด่วน | แอพกู้เงิน | แอพเงินด่วน | สินเชื่อออนไลน์อนุมัติทันที | Site Map | กู้เงินก้อน | กระเป๋าตัง | thisshop และ ยืมเงินฉุกเฉิน 5000 ด่วน