Asset Bundle ใน Unity 5 by

31
Jul
0

จากบทความที่แล้ว  เป็น Asset Bundle ใน Unity 4 มาวันนี้ Asset Bundle ได้ปรับรูปแบบวิธีการใช้งานแล้ว ผมจึงมา update วิธีใช้งานกันสักหน่อย

จากเดิมเราต้องเขียน Code ขึ้นมาใช้งานวนลูปหา file ที่ต้องการ ค่อนข้างยุ่งยาก และจะมีปัญหากรณีมี Bundle ตัวหนึ่งที่มี dependency เป็น asset ตัวเดียวกันก็อาจทำให้ต้องโหลด asset ตัวนั้นมาซ้ำกันได้ เช่น Bundle A มีรูปตัวละคร A ที่ต้องใช้ Background รูปหนึ่ง และ Bundle B มีรูปตัวละคร B ที่ต้องใช้ Background ตัวเดียวกัน แต่เดิมเพื่อตัดปัญหาความยุ่งยากเราอาจต้องใส่ Background ตัวนี้เข้าไปทั้งสอง Bundle แต่ถ้าเป็น Unity 5 จะไม่เป็นอย่างนั้นแล้วโดยเราสามารถระบุว่าอยากให้ไฟล์ไหนอยู่ใน Bundle อะไรแยกหมวดหมู่ได้ตั้งแต่อยู่ใน Editor ยังไม่ต้องเขียน Code เลย และในเคสนี้เราสามารถแบ่งเป็นสาม bundle คือ Bundle A, Bundle B, Bundle Background ได้อย่างสะดวก โดย Unity จะพิจารณาเอาเองว่าถ้าหนึ่งใน Bundle ที่เราสร้างมี dependency กับ Bundle อื่นๆ มันจะใส่ Bundle นั้นๆ เข้าไปซ้ำกันภายใน Bundle อื่นๆ อีกรอบ ส่งผลให้เราจัดการ dependency ได้ง่ายกว่าเดิมมาก เรามาดูขั้นตอนการสร้าง Bundle กันดีกว่า

1

  1. คลิกเลือก Resource ที่เราต้องการจะสร้าง Bundle สามารถ Multi Select ได้ตามรูป
  2. คลิกที่ช่อง None ใน Inspector ทางข้างล่าง ช่อง preview ตามรูป
    2 3
    4 5
  3. กด New และตั้งชื่อตามต้องการ โดยสามารถตั้งให้อยู่ใน directory ก็ได้เช่น crystal/form5 หรือ win เฉยๆ ก็จะไม่อยู่ภายใต้ folder ใดๆ
  4. สร้าง Folder Editor ขึ้นมา และสร้างไฟล์ C# เป็น Assets/Editor/AssetBundle.cs
  5. ระบุเนื้อหาภายใน Code เป็นดังนี้

    using UnityEngine;
    using UnityEditor;
    public class AssetBundle {
    [MenuItem("Assets/Build AssetBundle")]
    static void ExportResource () {
    BuildPipeline.BuildAssetBundles("bundle", BuildAssetBundleOptions.None, BuildTarget.Android); // เปลี่ยน Android เป็น Platform อื่นได้ตามใจชอบครับ
    }
    }
  6. สร้าง Folder ชื่อว่า “bundle” โดยอยู่ที่ folder project เลย (นอก Assets) เอาไว้เป็นที่เก็บไฟล์ bundle ที่สร้างจากข้อ 5 (parameter ตัวแรกนั่นแหละ สามารถตั้งเป็นชื่ออื่นแทนได้)
  7. จะมีเมนู “Build AssetBundle” ปรากฎภายใต้เมนู Assets ก็กดสร้างซะเลย
    6
  8. จะได้ผลลัพธ์ดังรูป
    7
  9. สำหรับ .manifest ลองเปิดไฟล์ win.manifest ด้วย Text Editor ใดๆ ก็จะพบดังนี้

    ManifestFileVersion: 0
    CRC: 2678385196
    Hashes:
    AssetFileHash:
    serializedVersion: 2
    Hash: 199d6df2d4882a014033858fb5748467
    TypeTreeHash:
    serializedVersion: 2
    Hash: 75957c18d05791510cbdd301a328d69f
    HashAppended: 0
    ClassTypes:
    - Class: 28
    Script: {instanceID: 0}
    - Class: 213
    Script: {instanceID: 0}
    Assets:
    - Assets/crystal_5_water/win_1.png
    Dependencies: []
  10. ตรงนี้อธิบายได้ดังนี้
    • ManifestFileVersion – เป็นเลขเวอร์ชั่น จะค่อยๆ ปรับขึ้นตามจำนวนการแก้ไขของเรา ตรงนี้ดีกว่า Unity4 มากๆ เพราะไฟล์ที่ไม่มีการเปลี่ยนแปลง Unity จะรู้โดยอัตโนมัติและไม่สร้างไฟล์ซ้ำ ทำให้ประหยัดเวลาสร้างขึ้นเยอะ
    • CRC – ใช้อ้างอิงเวลา load bundle หากมีการแก้ไขเลขนี้ ตัว unity จะสั่งโหลดใหม่จาก server ให้เอง หากไม่แก้ไขก็จะ load จาก cache ในเครื่อง
    • Hash (ดูที่ AssetFileHash ตัวเดียวพอ) – เลข Hash คล้ายๆ CRC ที่ใช้ตอน load bundle เพื่อว่ามี update ไหม แต่ต่างตรงที่สามารถกำหนดให้ไฟล์เวอร์ชั่น SD และ HD มี Hash เดียวกันได้เพื่อความสะดวกด้วยการกำหนดชื่อไฟล์ SD และ HD ให้เป็นชื่อเดียวกันในช่่องขวาของชื่อ Bundle
    • ClassTypes – อันนี้ไม่แน่ใจว่าคือไรครับ
    • Assets – ระบุว่า Bundle ตัวนี้มีไฟล์อะไรอยู่ด้านในบ้าง
    • Dependencies – Bundle ตัวนี้ต้องใช้คู่กับ Bundle ตัวอื่นหรือไม่

จบแต่เพียงเท่านี้ ขอให้ทำเกมให้สนุกนะครับ :)

วาดสัดส่วนไม่เพี้ยนด้วยวิธี Collage by

31
Jul
0

ร่างภาพในหัวออกมาคร่าวๆ
Capture01

เพ้นต์ BG พอสังเขป
Capture02
จากนั้นหาภาพตัวอย่างที่ตรงใจเรา
แต่การหาภาพตัวอย่างที่ตรงกับโพสต์ที่เราคิดขึ้นมานั้นยาก จึงต้องเลือกวัตถุดิบทีละชิ้น
เช่นได้ภาพกล้ามท้องที่ใช่แต่แขนไม่ใช่ ก็สามารถหาแขนจากภาพอื่นมาตัดแปะลงไป

00011   

ได้ภาพที่พอใจแล้วก็จัดการเพ้นต์ทับได้เลย !
หากทำ collage ออกมาได้สมส่วนดูดีแล้วล่ะก็ เรื่องสัดส่วนและมุมมองที่ยากก็ไม่เป็นปัญหาอีกต่อไป

Capture06Capture05

[Lua] การทำ เซ็ทแบบไม่เรียง จาก Table by

31
Jul
0

การทำ เซ็ทแบบไม่เรียง จาก Table นั้นทำมาเพื่อความประหยัดการประมวลผล ซึ่งโดยปกติแล้วถ้าเราใช้ Table เวลาเราจะดึงข้อมูลเราจะวน For จนกว่าจะเจอสิ่งที่เราต้องการแล้วค่อยดึง ทำให้ใช้การประมวลผลจำนวนมากกว่า การทำ Set ซึ่งจะเข้าถึง Index โดยตรง ซึ่งวิธีทำก็ไม่ยาก ใช้ 3 ฟังก์ชั่นด้านล่าง input ตัวแรกจะเป็น table ที่เราสร้างขึ้นมา ส่วนตัวที่สองก็เป็น key ที่เราจะใช้ในการเพิ่มลดหรือค้นหานั่นเอง

function addToSet(set, key)
set[key] = true
end
function removeFromSet(set, key)
set[key] = nil
end
function setContains(set, key)
return set[key] ~= nil
end

credits: http://stackoverflow.com/questions/2282444/how-to-check-if-a-table-contains-an-element-in-lua

การทำสายฟ้าแบบง่ายๆด้วย PhotoShop by

31
Jul
0

1.สร้างโปรเจคขึ้นมาเปลี่ยนสี BG เป็นสีดำเพื่อให้ง่ายต่อการดู
01

2.จากนั้นสร้างเลเยอร์ขึ้นใหม่ วาดสายฟ้าสีขาวรูปทรงตามใจชอบ
02

3.จากนั้นก็อปปี้รูปสายฟ้าเพิ่มอีก1รูป โดยคลิกขวาที่เลเยอร์เลือก Duplicate layer
03

4.เลือกเลเยอร์ที่เพิ่ง Duplicate และไปที่ Filter > Blur > Gaussian Blur จากนั้นปรับค่า Radius 10.0 Pixels
04

5.เลือกเลเยอร์เดิม ให้เปลี่ยนจากสีขาวเป็นสีฟ้า (1) และ ลากเลเยอร์มาไว้ล่างสายฟ้าต้นฉบับ (2) จะได้ตามรูป
05-2

6.ขั้นตอนสุดท้ายเลือก Duplicate layer เพิ่มอีก2-3 เลเยอร์ จะได้ตามรูป
06

เสร็จแล้วกับสายฟ้าอย่างง่าย หวังว่าจะมีประโยชน์นะครับ

วิธีดึงข้อมูลจาก excel มาใช้งานใน php โดย PHPExcel by

31
Jul
0

เนื่องจากไม่ได้อยู่หน้าเครื่องทำงานจริง จึงขอข้ามขั้นตอนการติดตัังไปไว้เดือนหน้านะครับ(กั๊กว่างั้น)
วิธิใช้นี้เป็นการทำงานผ่าน Code igniter นะครับ เริ่มต้นด้วยการประกาศค่าของ Reader กันเลย
ชุดแรกให้ประกาศไว้ใน function __construct() ครับ


$inputFileType = PHPExcel_IOFactory::identify($file_path);
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objReader->setReadDataOnly(TRUE);
$this->xlsx = $objReader->load($file_path);

  • บรรทัดแรกเป็นการหาประเภท file ครับ ถ้าไม่รู้ ไม่อยากรู่้ หรือขี้เกียจก็ประกาศไว้อย่างงี้ให้โปรแกรมมันไปหาเอาเองหล่ะกัน
  • บรรทัดต่อมาเป็นการกำหนดให้สร้าง reader ตาม file type ที่ได้มาจาก identify
  • บรรทัดที่สามใส่ไว้ถ้าต้องการแค่ดึงข้อมูลออกมาจาก excel ครับ ลดการทำงานของ function ประหยัดทรัพยากร
  • แล้วก็ทำการสั่งโหลด file ใส่ตัวแปลเอาไว้ครับ อย่าลืมประกาศ ตัวแปลเพื่อจะได้ใช้งานทีเดียวครับ

ชุดต่อมาเป็นการใช้งานภายใน function

$this->xlsx->setActiveSheetIndex(0);
$data = $this->xlsx->getActiveSheet()->toArray(null, true, true, true);

  • บรรทัดแรกใช้ตั้งค่า active sheet ครับ เริ่มนับจาก 0
  • บรรทัดที่สองก็ทำการดึงค่า active sheet มาใส่ไว้ใน ตัวแปล array เพื่อใช้งานใน php กันต่อไปครับ

วิธีอ้างถึงข้อมูลคือ $data[แถว][คอลัมน์] เช่น $data[0]['A']

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