[UNITY][NGUI]ปัญหาที่พบบ่อย, สาเหตุ และวิธีแก้ by

28
Jul
0

ปัญหา – สร้างปุ่มขึ้นมาปุ่มหนึ่ง พอกด Play ทีไร ปุ่มนี้ก็กลายเป็น Disable ไปซะทุกที??
สาเหตุ – Script UIButton ของ NGUI นั้น จะเช็คเสมอว่า Object ที่เรา AddComponent UIButton เข้าไปนั้น มี Collider อยู่รึเปล่า ถ้าไม่มี Script UIButton ก็จะ Disable ปุ่มนั้นอัตโนมัติเลยล่ะ
วิธีแก้ – ก็แค่ Add Collider ให้ปุ่มซะก็จบแล้วครัช

ปัญหา – อยากเรียงลำดับ Panel ที่จะ Instantiate ขึ้นมาใหม่แต่ ตอนรับข้อมูลมานั้น มันมาแบบ ไม่เรียงมาให้ แล้วแต่อารมณ์
วิธีแก้ – ให้ตั้งค่า depth ของ Panel ที่อยากให้แสดงก่อนมีค่ามากกว่า แล้ว Instantiate ขึ้นมาพร้อมๆกันไปแล้ว ทีนี้ จะสร้างอันไหนก่อนหลังก็ไม่สำคัญ เพราะว่าอันที่มี depth มากกว่า จะอยู่ข้างบนเสมอ แล้วพอเรา Hide หรือ Destroy อันที่อยู่ข้างบน เราก็จะเห็นอันถัดมาเรื่อยๆๆๆ นั้นเอง

ปัญหา – เขียน Method Awake หรือ Start ขึ้นมา Method พวกนี้ดันไม่ทำงานตอนเริ่มแรก แต่ดันมาทำงานตอนกลางๆ หรือตอนที่เรา Enable มันขึ้นมาซะงั้น (นี่ Method Awake นะว้อยไม่ใช่ OnEnable)
สาเหตุ – ที่ Method Awake หรือ Start มันไม่ทำงานตอนเรื่มแรกนั้นก็เพราะว่า เรา Disable มันไว้ตั้งแต่แรกกกก ก่อนที่จะ Play ซะอีกน่ะสิ
วิธีแก้ – ก็ให้ Enable มันไว้ซะ แต่ถ้าหากเริ่มมาอยากให้มัน Disable ไว้แล้วค่อยไปเรียกใช้ทีหลังล่ะก็ ก่อนไปเขียน Code ให้มัน Disable เอาตอนท้ายของ Method Start เอาละกัน มันจะได้ทำ Awake และ Start ให้เสร็จก่อนนะจ้าา

[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 ที่ เกิดติดๆกัน อยู่ใกล้กันมากกว่ากี่เปอร์เซนของพื้นที่ ที่เรากำหนดไว้ข้างต้นครับ

[Unity3D][NGUI][ParticleSystem] ใช้ ParticleSystem ร่วมกับ NGUI ใน Unity3D by

30
May
0

เมื่อเราใช้ ParticleSystem ร่วมกับ NGUI ใน Unity3D แล้วก็จะเจอปัญหา Particle ที่เรา Instantiate ขึ้้นมา มันตันไปอยู่ข้างหลัง UI หรือของต่างๆที่เป็น NGUI นะสิ จะปรับ z ก็ไม่ได้ เพราะว่า NGUI นั้นไม่สน z จะปรับ depth ก็ไม่ได้เพราะ Particle ไม่มี depth เอ้า แล้วจะทำยังไงละทีนี้ วิธีแก้ก็มีหลายอย่างมากมาย แต่วันนี้จะมานำเสนอ 2 วิธีนะครับ

วิธีแรกคือ ปรับ Sorting Order ของ Panel ที่เป็น Parent ของ Particle เป็น -1 ครับ ตามรูปเลย
11
พอเราปรับเป็น -1 แล้ว Particle ที่เคยอยู่ข้างหลังสุด ก็กลับมาอยู่หน้าสุดทันทีเลย 55 แต่ๆๆๆๆ วิธีนี้มีข้อเสียใหญ่หลวงๆๆอยู่ด้วยนั่นก็คือ มันจะกลับข้างหลัง-หน้า ทุกอย่างที่อยู่ใน Panel นั้นๆ หมดเลย เหอะๆ (กำ แล้วมาแนะนำทำไมฟะ) ถ้าของใน Panel นั้นไม่มีการเรียงลำดับ depth ซับซ้อนก็ให้ลองวิธีนี้ดูก่อนไงครับ มันปรับนิดเดียวเอง ถ้าปรับแล้ว มันมั่วมากๆๆๆ ก็ค่อยไปลองวิธีถุัดไปละกันเนอะ

วิธีที่สองคือ ให้เพิ่ม Layer เข้าไปอีกชั้นนึงตามรูป
12
พอกดแล้วจะขึ้นตามนี้ ก็พิมชื่อ Layer เข้าไป เช่น “Particle” ตามรูป
13
ต่อไปก็ให้ไปเปลี่ยน Layer ของ Particle ของเราให้เป็น Layer ใหม่ที่เราพึ่งตั้งเมือกี้ ตามรูป
14
ถ้ากดเปลี่ยน Layer แล้ว Unity มันถามว่าจะให้เปลี่ยนลูกๆเป็น Layer เดียวกันด้วยไหมก็ให้ตอบไปว่า “ใช่เสะ” ครับ

และถ้าเรา Instantiate Particle ที่มี Layer สูงกว่า Layer UI ของ NGUI แล้ว Particle นั้นก็จะถูก Render มาอยู่ข้างบนครับบบบบ

[Unity3D][NGUI] ScrollView && Grid by

30
May
0

ใครทีใช้ Unity3D ร่วมกับ NGUI ก็คงจะเคยเจอปัญหาเรื่องของ ScrollView และ Grid กันมาบ้าง วันนี้ผมมาเสนอวิธีแก้ปัญหา ScrollView และ Grid ที่ผมเคยเจอครับ

ปัญหาแรกคือ เมื่อ เราสร้างลูกของ Grid แบบ Run Time แล้วสั่ง Grid.Reposition(); และตามด้วยคำสั่ง ScrollView.ResetPosition(); เราก็จะเห็นว่าลูกของ Grid ที่เราพึ่งสร้างนั้นค่อยๆเลือนไปประจำตำแหน่งของมัน

ปัญหาที่สองคือ ถ้าเราสร้างลูกของ Grid มาจำนวนน้อย หรือมีจำนวนไม่มากพอที่จะทำให้ Grid นั้นล้นออกนอก ScrollView แล้วมันก็จะทำให้ ลูกของ Grid นั้นไปอยู่ตรงกลาง ScrollView ดังรูป
1

ปัญหาที่สามคือ เมื่อเราทำ Application หรือ Game ในหลายๆขนาดหน้าจอ ถ้าเราอยากให้ Grid ของเราอยู่ชิดข้างบนเสมอล่ะ ทำยังไงดี ก็ Grid มันไม่มี Anchor นี่นา

วิธีแก้ก็ทำตามนี้เลยครับ
ถ้าเป็น Grid แบบนี้
4
ให้ Set ค่า ScrollView ตามนี้ครับ
2
และ Set ค่า Grid ตามนี้ ซึ่งเราต้อง Add Component UIWidget ให้ Grid ด้วยมันจะได้มี Anchor ให้เราใช้ไงครับ
3

แต่ถ้าเป็น Grid แบบนี้
5
ก็ให้ Set ScrollView ตามนี้ครับ
6
และ Grid ตามนี้
7

ให้สังเกต ScrollView ตรง Content Origin นะครับ
และให้สังเกต Grid ตรง Pivot, Smooth Tween และ ขนาดของ UIWidget นะครับ

batch file ทำอะไรได้มากกว่าที่คิด by

17
Mar
0

วันนี้ได้รับโจทย์มาว่า ให้เขียน Script อะไรก็ได้ copy ไฟล์ ชื่อ skill_1 และ skill_2 จากใน(หลายๆๆๆๆๆๆๆ) folder แล้ว rename ให้ชื่อ file เหมือนกับชื่อ folder ตามด้วย _1 และ _2 ตามลำดับ แล้วเอาออกไปไว้รวมกัน ก็เลยเขียนเป็น batch file ซะเลย

ตอนแรกที่เขียนๆไป code ก็หน้าตาประมาณนี้


@echo off
for /r %%a in ("*skill_1.png") do (
set str=%%~pa
copy %%a %str:~0,-1%_1.png
)
for /r %%a in ("*skill_2.png") do (
set str=%%~pa
copy %%a %str:~0,-1%_2.png
)

แต่แล้วปัญหาก็เกิดขึ้น คือคำสั่ง set เนี่ยมันยังไงไม่รุ เหมือนกันไป set ทีเดียวตอนจบการทำงานทั้งหมด พอ run code นี้ ก็เลยได้ออกมา 2 ไฟล์ เพราะ str ดันออกมามีค่าเดียวซะงั้น – -”

ก็เลยแก้ปัญหาด้วยการ สร้าง batch file อีกอันตั้งชื่อว่า copy_rename2.bat แล้วแยก code ออกเป็น 2 ไฟล์ดังนี้

1.

@echo off
for /r %%a in ("*skill_1.png") do (
echo %%~pa
call "copy_rename2" %%~pa
)

2.

@echo off
set str=%1
echo %str:~0,-1%
copy %1skill_1.png %str:~0,-1%_1.png
copy %1skill_2.png %str:~0,-1%_2.png

แล้วเอาวางไว้ข้างๆกัน พอ run batch file อันที่ 1 มันก็ไปเรียก อันที่2 โดยทำให้ตัวแปร str มันแยกกันคนละ session คร้าาฟฟฟฟ

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