การแก้ปัญหาการโหลดรูปโปรไฟล์ Facebook ใน iOS ไม่ได้เพราะติดการ Redirect by

30
Nov
0

หลังจากที่อัพ iOS + XCode เวอร์ชั่นใหม่แล้ว ทำให้เกิดปัญหา
ซึ่งจาก Error แล้วเดาได้ว่าทาง iOS ไม่ยอมให้มีการโหลดรูปจาก url ที่มีการ redirect แล้ว
เลยมีวิธีแก้ไขดังนี้ครับ

โค้ดเดิม

IEnumerator LoadPictureWWW(string url)
{
WWW www = new WWW(url);
yield return www;
Material mat = new Material(Shader.Find("Unlit/Transparent Colored (AlphaClip)"));
mat.mainTexture = www.texture;
UITexture _uit = gameObject.GetComponent();
if (_uit == null)
{
Debug.Log("playerWWW == null");
gameObject.AddComponent();
}
this.GetComponent().material = mat;
}

ตามด้านบนวิธีเก่าจะโหลดไม่สำเร็จเพราะยิงไปแล้วโดน Redirect แต่ทาง iOS จะไม่ทำการ Redirect ต่อทำให้ www.texture ไม่ได้ค่าออกมา
วิธีการแก้ไขคือเราต้องยิง url ไปรอบนึงแล้วเอา Result มาดูค่า url ที่ได้จากการ redirect แล้วมาเพื่อยิงเองต่ออีกครั้งนึงดังนี้


public static IEnumerator _loadFacebookProfileImage (string userId, UITexture texture, int size)
{
string url = string.Format ("https://graph.facebook.com/{0}/picture?width={1}&height={1}&redirect=false", userId, size);
WWW www1 = new WWW (url);
yield return www1; //ทำการยิงครั้งแรก
if (string.IsNullOrEmpty (www1.error)) {
JSONNode result = JSON.Parse (www1.text) //แปลง return ที่ได้มาแล้วแกะข้อมูล;
string realUrl = result ["data"] ["url"]; //เอาข้อมูล data.url มาใช้ยิงอีกครั้ง
WWW www2 = new WWW (realUrl);
yield return www2; //ยิงครั้งที่สอง จะได้ข้อมูลรูปตามปกติ
Material mat = new Material (Resources.Load ("EmptyMaterial", typeof(Material)) as Material);
if (string.IsNullOrEmpty (www2.error))
mat.mainTexture = www2.texture;
else
Debug.LogError ("_loadFacebookProfileImage www2 Error: " + www2.error);
if(texture != null) texture.material = mat;
} else
Debug.LogError ("_loadFacebookProfileImage www1 Error: " + www1.error);
}

เพียงเท่านี้ก็ใช้ได้แล้วครับ

วิธีการแก้ไขปัญหา Unity ไม่รวม AndroidManifest บางตัวให้ by

31
Oct
0

ในขั้นแรกขออธิบายวิธีการเช็ค AndroidManifest ตัวที่ใช้จริงกันก่อน เนื่องจากในโฟลเดอร์ Plugin > Android ของเราจะมีไฟล์ AndroidManifest.xml อยู่มากมาย ซึ่งตามปกติแล้ว Unity จะทำการรวมไฟล์พวกนี้ให้เป็นไฟล์เดียวไว้ใช้งานจริงบน Run time ซึ่งวิธีการเช็คก็คือ

  • ที่ File > Build Settings… ติ้กเลือก Google Android Project แล้วเลือกโฟลเดอร์

  • โฟลเดอร์ที่ได้ออกมาจะมี AndroidManifest.xml ตัวที่ใช้งานจริง ให้เปิดเช็คดูว่ามี  Tag  ครบตามที่มีทั้งหมดหรือไม่ หรือถ้ารันแล้วตัวไหนพังก็มาเช็คดูว่าขาดตัวไหนไปหรือเปล่า

ซึ่งหลังจากที่เราใช้ POKKT Unity SDK 4.1.1 เราก็ได้พบปัญหาดังกล่าวว่า AndroidManifest.xml ที่สร้างขึ้นมาไม่ยอมรวมเป็น AndroidManifest.xml ตัวหลัก ซึ่งวิธีแก้ไขก็ง่ายๆ Copy  Tag  ที่จำเป็นต้องใช้ แล้วนำไปฝากกับ AndroidManifest.xml ของ Plugin ตัวอื่นๆ ซึ่งจากที่เราทำเราได้เอา Tag ไปฝากไว้กับ Chartboost ซึ่งออกมาก็ได้ผลทีถูกต้อง

วิธีทำให้ปุ่มกดไม่ได้โดยที่ไม่เปลี่ยน 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;
}

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

วิธีใส่แสงประกอบฉากให้กับตัว Spine (Unity) by

31
Jul
0

Spine  นั้นจะรับแต่ Point Light เท่านั้น ดังนั้นต้องเลือกให้ถูกนะ ขั้นตอนการใส่แสง Ambient ก็มีดังนี้

รูปก่อนการใส่แสง Ambient

  • เลือกส่วนประกอบของ Spine ของเรา ที่มี Skeleton Parts Renderer

  • ที่สคริปท์ Skeleton Parts Renderer เปลี่ยน Shader เป็น Spine/Skeleton Lit

  • จากนั้น Spine ที่เราเลือกจะดำมืดไป ไม่ต้องตกใจเพราะเรายังไม่ได้ใส่แสงให้มันนั่นเอง

  • วิธีการใส่แสง ก็ไปที่เมนู GameObject -> Light -> Point Light

  • สร้างเสร็จก็จัดตำแหน่งให้เรียบร้อย และปรับค่าของแสงได้ที่สคริปท์ Light
    Type – ให้ใช้เป็น Point ไว้ แบบอิ่นจะไม่มีผลกับ Spine
    Range – ระยะของแสงของเราที่จะให้มีผล
    Color – ปรับสีของแสง Ambient
    Intensity – ปรับความเข้มของแสง เวลามีหลายๆแสงชนกัน Intensity สูงจะแสดงผลชัดกว่า

  • หลังจากตั้งค่าเสร็จก็จะได้รูปดังนี้ ชมพูชวิ้งแว้บ เท่านี้ก็เรียบร้อย

  • อันนี้เป็นตัวอย่างหลังจากใส่จุดกำเนิดแสงเพิ่ม