วิธีสร้างตัวควบคุมเกมแบบกำหนดเองด้วย Arduino และ Unity

วิธีสร้างตัวควบคุมเกมแบบกำหนดเองด้วย Arduino และ Unity

คุณเคยต้องการออกแบบตัวควบคุมเกมของคุณเองหรือไม่? ง่ายกว่าที่คิด!





ในโปรเจ็กต์สั้นๆ นี้ เราจะสร้างคอนโทรลเลอร์เกมแบบกำหนดเองอย่างง่ายเพื่อใช้กับเอ็นจิ้นเกม Unity คอนโทรลเลอร์นี้จะขับเคลื่อนโดย Arduino Uno แม้ว่าคุณจะสามารถใช้ทางเลือกอื่นสำหรับโครงการนี้ได้เช่นกัน เราจะสร้างเกมพื้นฐานที่คุณจะใช้คอนโทรลเลอร์ของคุณเพื่อหลีกเลี่ยงวัตถุที่ตกลงมาและทำให้เวลาช้าลง





สำหรับโครงการนี้ คุณจะต้องการ

  • Arduino หรือไมโครคอนโทรลเลอร์ที่คล้ายกัน
  • ตัวต้านทาน 1 x 10k Ohm
  • 1 x สวิตช์ชั่วขณะ
  • 1 x โพเทนชิออมิเตอร์
  • สายต่อ
  • เขียงหั่นขนม
  • เอ็นจิ้นเกมสามัคคี
  • ปลั๊กอิน Uniduino จาก Unity Asset Store ($ 30)
  • กรอกรหัสโครงการ ในกรณีที่คุณไม่ต้องการเขียนมันออกมา (ไม่รวมปลั๊กอิน Uniduino)

สิ่งเหล่านี้ส่วนใหญ่มีอยู่ในชุดสตาร์ท Arduino หากยังไม่มีชุดเริ่มต้น โปรดดูคำแนะนำในการเลือกชุดที่ดีที่สุดสำหรับคุณ





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

การประกอบคอนโทรลเลอร์ของคุณ

ตั้งค่าเขียงหั่นขนมและ Arduino ตามที่แสดงในภาพด้านล่าง นี่คือสิ่งที่เราจะใช้เป็นตัวควบคุมเกมของเรา แม้ว่าคุณสามารถใช้การตั้งค่าเดียวกันกับ a . ได้เกือบทั้งหมด ตัวควบคุม midi DIY ด้วย!



การเตรียม Arduino . ของคุณ

เมื่อคุณวางสายทุกอย่างเรียบร้อยแล้ว ให้เชื่อมต่อ Arduino ของคุณผ่าน USB ใน Arduino Software IDE ให้ไปที่ เครื่องมือ > กระดาน และ เครื่องมือ > พอร์ต เพื่อเลือกไมโครคอนโทรลเลอร์และพอร์ตที่คุณใช้ Arduino IDE มาพร้อมกับภาพร่างที่เราต้องการ และคุณสามารถค้นหาได้ภายใต้ ไฟล์> ตัวอย่าง> Firmata> StandardFirmat . คลิกอัปโหลดและคุณพร้อมที่จะไป

หากคุณยังใหม่กับ Arduino และหัวของคุณละลายเล็กน้อย ลองดู .ของเรา คู่มือสำหรับผู้เริ่มต้น เพื่อช่วยให้คุณสนทนากับคอมพิวเตอร์ได้อย่างดี





ตั้งโครงการสามัคคีของคุณ

ใน Unity เปิด หน้าต่าง > ร้านค้าสินทรัพย์ เพื่อเข้าถึง Unity's Asset Store จากภายใน Unity Editor ค้นหาที่เก็บสินทรัพย์สำหรับปลั๊กอิน Uniduino ปลั๊กอินนี้จะช่วยให้คุณรับและส่งข้อมูลไปยังและจากพิน Arduino ของคุณภายใน Unity ปลั๊กอินในขณะที่เขียนมีราคา 30 เหรียญ มันเป็นไปได้ ในการทำโปรเจ็กต์นี้โดยไม่ต้องซื้อปลั๊กอิน แม้ว่าจะค่อนข้างซับซ้อนกว่าและคุณอาจพบว่าปลั๊กอินนี้สะดวกกว่าในทุก ๆ ด้าน

วิดีโอจากผู้สร้างปลั๊กอินนี้จะนำคุณผ่านขั้นตอนการทดสอบทุกอย่างใช้งานได้พร้อมกับการตั้งค่าครั้งแรก โปรดทราบว่าคุณอาจต้องรีเซ็ตตัวแก้ไข Unity บน Windows ด้วย





เราสามารถใช้แผงทดสอบเดียวกันนี้เพื่อทดสอบตัวควบคุมของเรา ตั้งค่า Pin D2 เป็น INPUT และ Digital ลงไปอีก ตั้งค่า Pin A5 เป็น ANALOG โพเทนชิออมิเตอร์และปุ่มของคุณควรแสดงค่าบนหน้าจอถัดจากหมายเลขพินทันที ความคืบหน้า!

ตอนนี้เพื่อสร้างสิ่งที่เราควบคุมได้

เรามีตัวควบคุม แต่เราจะควบคุมอะไรได้บ้าง? ความเป็นไปได้ไม่มีที่สิ้นสุด แต่สำหรับวันนี้ เราจะสร้างเกมการหลบหลีกที่ง่ายมากเพื่อทดสอบระบบควบคุมใหม่ของเรา เราจะย้ายไปยังการตั้งค่าเกมอย่างรวดเร็ว ดังนั้นหากคุณยังใหม่กับเอ็นจิ้น Unity โดยสิ้นเชิง คุณอาจพบว่า คู่มือสำหรับผู้เริ่มต้นเขียนโปรแกรมเกม Unity มีประโยชน์ในการรับแบริ่งของคุณ

เราจะสร้างเกมพื้นฐานที่เป้าหมายของคุณคือหลบลูกของคุณไปทางซ้ายและขวาเพื่อหลีกเลี่ยงลูกบาศก์ที่ตกลงมา ซึ่งจะใช้ตัวควบคุมที่คุณสร้างขึ้นใหม่

สร้างฉากใหม่และลาก Uniduino prefab จาก ทรัพย์สิน > Uniduino > รูปแบบสำเร็จรูป ลงในลำดับชั้นของคุณและลาก Uniduino prefab เข้าสู่ลำดับชั้น เราต้องการมันที่นั่นเพื่อพูดคุยระหว่างเกมกับคอนโทรลเลอร์ของเรา

ในลำดับชั้น Unity คลิก สร้าง > Sphere และใช้แท็บ Transform ใน Inspector เพื่อย้ายไปที่ด้านล่างของหน้าจอเกม

ได้เวลารับการเข้ารหัส

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

using UnityEngine;
using System.Collections;
using Uniduino;
public class sphereMover : MonoBehaviour
{
//Headers aren't scrictly neccesary, but they make life easier back in the Inspector.
[Header('Arduino Variables')]
//we need to declare the Arduino as a variable
public Arduino arduino;
//we need to declare an integer for the pin number of our potentiometer,
//making these variables public means we can change them in the editor later
//if we change the layout of our arduino
public int potPinNumber;
//a float variable to hold the potentiometer value (0 - 1023)
public float potValue;
//we will later remap that potValue to the y position of our capsule and hold it in this variable
public float mappedPot;
//public int for our button pin
public int buttonPinNumber;
[Header('Sphere Variables')]
//variables to hold the values we noted earlier for the sides of our screen
public float leftEdge;
public float rightEdge;
// Use this for initialization
void Start ()
{//and initialize we shall, starting with the Arduino Variable.
//we are only using one arduino, so we can use Arduino.global to grab it.
arduino = Arduino.global;
arduino.Setup(ConfigurePins);
}
void ConfigurePins()
{
//configure the Arduino pin to be analog for our potentiometer
arduino.pinMode(potPinNumber, PinMode.ANALOG);
//Tell the Arduino to report any changes in the value of our potentiometer
arduino.reportAnalog(5, 1);
//configure our Button pin
arduino.pinMode(buttonPinNumber, PinMode.INPUT);
arduino.reportDigital((byte)(buttonPinNumber / 8), 1);
}
}

ใช้เวลาสักครู่เพื่ออ่านความคิดเห็นเกี่ยวกับโค้ด จนถึงตอนนี้ เราได้ประกาศตัวแปรบางตัวสำหรับ Arduino, พิน และ Sphere ของเราแล้ว เรายังใช้

Start และ ConfigurePins วิธีในการเริ่มต้น Arduino ของเราในเวลาทำงาน ให้บันทึกสคริปต์ของเรา และกลับไปที่เครื่องมือแก้ไข Unity และดูว่ามีอะไรเปลี่ยนแปลงบ้าง

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

สัญญาณแรกของชีวิต

ถึงเวลาที่จะเห็นค่าจาก Arduino ของเราภายใน Unity Editor สำหรับตอนนี้ เราสามารถเพิ่มโค้ดหนึ่งบรรทัดลงในฟังก์ชันอัปเดตของสคริปต์ sphereMover และบันทึกสคริปต์อีกครั้ง

void Update ()
{
//We assign the value the arduino is reading from our potentionmeter to our potValue variable
potValue = arduino.analogRead(potPinNumber);
}

ตอนนี้เราได้อัปเดตตัวแปร potValue ทุกเฟรมแล้ว เราจะเห็นค่านั้นแบบเรียลไทม์ใน Unity Inspector ก่อนที่เราจะทำการทดสอบ ตอนนี้เป็นเวลาที่ดีที่จะตรวจสอบว่าปลั๊กอิน Uniduino กำลังฟังอยู่ที่พอร์ตที่ถูกต้อง คลิกที่ Uniduino ใน Heirarchy และตรวจสอบว่าเป็น Port Name ในตัวตรวจสอบ หากว่างเปล่า ให้กรอกหมายเลขพอร์ตที่ถูกต้องสำหรับ Arduino ของคุณ ในกรณีนี้คือ COM4 แม้ว่าอาจแตกต่างกันไปสำหรับคุณ ตรวจสอบโดยใช้ Arduino IDE หากคุณไม่แน่ใจ

เลือกทรงกลมของคุณในลำดับชั้นและคลิกปุ่มเล่นที่ด้านบนของหน้าจอ ระบบต้องใช้เวลาสองสามวินาทีในการเริ่มต้น หลังจากนั้นคุณควรเริ่มเห็นการเปลี่ยนแปลงตัวแปร Pot Value ในตัวตรวจสอบเมื่อคุณย้ายโพเทนชิออมิเตอร์

ตอนนี้เรากำลังพูดถึง! พูดอย่างเคร่งครัด Unity และ Arduino กำลังคุยกันอยู่ แต่ใครจะนับล่ะ หากคุณมาไกลถึงขนาดนี้แล้วและไม่เห็นการเปลี่ยนแปลงของค่าในตัวตรวจสอบ ให้ตรวจสอบขั้นตอนการตั้งค่า และตรวจสอบให้แน่ใจว่าคุณได้เลือกพอร์ตที่ถูกต้องสำหรับ Arduino ของคุณ

มาย้ายทรงกลมนี้กันเถอะ

ตอนนี้เราได้อัปเดตตัวแปร potValue แล้ว เราต้องการใช้ค่านี้เพื่อย้ายทรงกลมของเรา เมื่อโพเทนชิออมิเตอร์ไปทางซ้าย เราต้องการให้ทรงกลมอยู่ทางด้านซ้ายของหน้าจอ และในทางกลับกัน ออบเจ็กต์ใน Unity ถูกจัดตำแหน่งไว้ที่จุดในเวคเตอร์สเปซ ซึ่งกำหนดโดยค่าของมัน Transform.position . ในภาพด้านล่าง ที่ซึ่งทรงกลมอยู่ห่างจากจุดที่ไกลที่สุดไปทางซ้าย คุณจะเห็นได้ว่าเวกเตอร์ตำแหน่งคือ 9.5, -4, 0

เราต้องการส่งผลต่อตำแหน่ง X ของทรงกลม น่าเสียดายที่การใช้ค่าจากโพเทนชิออมิเตอร์ของเราโดยตรงจะไม่ทำงาน เนื่องจากเมื่อโพเทนชิออมิเตอร์ไปทางซ้ายจนสุด มันจะให้ค่าเป็น 0 ซึ่งจะทำให้ทรงกลมของเราอยู่ตรงกลางหน้าจอ ในอีกทางหนึ่ง ค่าสูงสุดของโพเทนชิออมิเตอร์ 1023 จะวางลูกบาศก์ไปทางขวาของหน้าจอของเรา ไม่มีประโยชน์. สิ่งที่เราต้องการคือคณิตศาสตร์

ทำไมคณิตศาสตร์ถึงทำเมื่อความสามัคคีจะทำเพื่อคุณ?

สำหรับพวกคุณที่กลัวการจ้องมองกระดาษแผ่นหนึ่งที่มีตัวเลขไร้สาระอยู่บ้าง (แม้ว่าจะมีบ้าง เว็บไซต์ที่ดี ที่สามารถช่วยให้คุณเรียนรู้คณิตศาสตร์ได้) อย่ากลัวเลย เราต้องการวิธีสร้างค่าโพเทนชิออมิเตอร์ให้สอดคล้องกับตำแหน่ง X ของทรงกลมของเรา โชคดีที่เราสามารถใช้ an วิธีการขยาย .

วิธีการขยายเป็นสคริปต์ที่ทำงานเฉพาะสำหรับเรา ในกรณีนี้ เราให้ค่าที่เรามีและส่งกลับค่าที่จับคู่กัน พร้อมที่จะใช้ใน sphereMover สคริปต์ ที่ด้านบนของแผงโครงการ คลิก สร้าง > C# สคริปต์ และตั้งชื่อว่า ExtensionMethods ป้อนรหัสด้านล่างลงในสคริปต์:

using UnityEngine;
using System.Collections;
public static class ExtensionMethods {

//our handy dandy Remapper function
public static float Remap (this float value, float from1, float to1, float from2, float to2)
{
return (value - from1) / (to1 - from1) * (to2 - from2) + from2;
}
}

บันทึกสคริปต์ และกลับไปที่สคริปต์ sphereMover ของคุณ ตอนนี้เราสามารถใช้ฟังก์ชัน Remap นี้ในสคริปต์ ExtensionMethods ในฟังก์ชัน Update เพื่อแปลงค่าโพเทนชิออมิเตอร์ของเราให้เป็นค่าที่ใช้งานได้ในเกมของเรา ภายใต้ที่เราเพิ่งกำหนดตัวแปร potValue ให้พิมพ์ดังต่อไปนี้:

พร้อมท์แสดงให้เราเห็นว่าการรีแมปของเราใช้ค่า From และ To สองชุด และแมปเข้าด้วยกัน เราสามารถใส่ค่าของเราลงไปได้

mappedPot = potValue.Remap(0, 1023, leftEdge, rightEdge);

บันทึกสคริปต์ของคุณ กลับไปที่ตัวแก้ไข Unity แล้วกดปุ่มเล่น ตอนนี้คุณควรเห็นว่าตัวแปร Mapped Pot เปลี่ยนแปลงเมื่อคุณย้ายโพเทนชิออมิเตอร์ เพื่อให้สอดคล้องกับค่าที่เรากำหนดสำหรับขอบด้านซ้ายและขวาของเรา ใช้เวลาสักครู่เพื่อนั่งลงและขอบคุณสคริปต์ ExtensionMethods ของคุณ ไม่ใช่เครื่องคิดเลขในสายตา

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

ในที่สุดเราก็มีค่าที่ใช้งานได้แล้ว ตอนนี้สิ่งที่เหลืออยู่คือการกำหนดค่าเหล่านั้นให้กับตำแหน่ง X ของทรงกลมของเรา:

ฉันจะโอนเพลงจาก iPod ลง iTunes ได้อย่างไร
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

บันทึกสคริปต์ของคุณ กลับไปที่ตัวแก้ไข Unity แล้วกดเล่น ตอนนี้คุณควรจะย้าย Sphere ของคุณไปทางซ้ายและขวาโดยใช้โพเทนชิออมิเตอร์ได้แล้ว!

วางปุ่มให้ทำงาน

ตอนนี้เรามีทรงกลมเคลื่อนที่แล้ว จะดีกว่าไหมที่จะมีวิธีทำให้สิ่งต่างๆ ช้าลงเล็กน้อยเมื่อเราอยู่ในจุดที่คับแคบ เราจะใช้ปุ่มของเราเพื่อชะลอเวลาในเกมของเรา เปิดสคริปต์ sphereMover ของคุณ และเพิ่มโค้ดนี้ในฟังก์ชันอัปเดตของคุณ

//if Unity detects the button is being pressed, the time scale slows down
if (arduino.digitalRead(buttonPinNumber) == 1){
Time.timeScale = 0.4f;
}
else Time.timeScale = 1.0f;

ตอนนี้เรามีกลไกของเกมแล้ว มาเพิ่มอุปสรรคกัน! เราจะใช้ศัตรูธรรมชาติของทรงกลม ลูกบาศก์ ในลำดับชั้น คลิก สร้าง > วัตถุ 3 มิติ > Cube . ในตัวตรวจสอบลูกบาศก์ เพิ่มส่วนประกอบ > ฟิสิกส์ > Rigidbody . ตั้งค่า Drag ของ rigidbody เป็น 5 นอกจากนี้ ภายใต้องค์ประกอบ Box Collider ในตัวตรวจสอบ ให้เลือก Is Trigger ซึ่งจะทำให้เราสามารถตรวจจับการชนกับ Sphere ของเราได้

สร้างสคริปต์บนคิวบ์แล้วเรียกมันว่า ชนกับสเฟียร์ ให้เปิดสคริปต์และลบฟังก์ชัน Start and Update เนื่องจากเราจะไม่ต้องการมันในครั้งนี้ ใส่รหัสนี้:

using UnityEngine;
using System.Collections;
public class collideWithSphere : MonoBehaviour
{
void OnTriggerEnter(Collider other)
{
Destroy(other.gameObject);
}
}

OnTriggerEnter จะส่งข้อความเมื่อใดก็ตามที่ทริกเกอร์ collider กระทบกับ collider อื่น ในกรณีนี้ เรากำลังบอกให้มันทำลายทุกอย่างที่มันสัมผัส บันทึกสคริปต์และกลับไปที่ตัวแก้ไข Unity ลากคิวบ์จากลำดับชั้นไปยังแผงโครงการ คุณจะสังเกตเห็นข้อความของคิวบ์ในลำดับชั้นเปลี่ยนเป็นสีน้ำเงิน เนื่องจากเราได้สร้างรูปแบบสำเร็จรูปและบันทึกไว้ในโครงการของเรา ลบคิวบ์ของคุณออกจากลำดับชั้นทันที

ทั้งหมดที่เราต้องการตอนนี้คือสคริปต์เพื่อวางไข่ลูกบาศก์ ในลำดับชั้น คลิก สร้าง > สร้างว่างเปล่า และเปลี่ยนชื่อเป็น Game Manager ใน Inspector และเพิ่มสคริปต์ที่เรียกว่า gameManager เปิดสคริปต์และเพิ่มรหัสนี้:

using UnityEngine;
using System.Collections;
public class gameManager : MonoBehaviour {
//a variable to hold the prefab we want to spawn
public GameObject cube;
//we want some variables to decide how any cubes to spawn
//and how high above us we want them to spawn
public int numberToSpwan;
public float lowestSpawnheight;
public float highestSpawnheight;
// Use this for initialization
void Start ()
{
for (int i = 0; i {
Instantiate(cube, new Vector3(Random.Range(-9, 9), Random.Range(lowestSpawnheight, highestSpawnheight), 0), Quaternion.identity);
}
}

// Update is called once per frame
void Update ()
{

}
}

บันทึกสคริปต์ กลับไปที่เอดิเตอร์ เลือก Game Manager ในลำดับชั้น และลากคิวบ์พรีแฟบของคุณจากพาเนลโปรเจ็กต์ไปยังตัวแปร Cube ในตัวตรวจสอบ กรอกค่าสำหรับการวางไข่ของคุณที่นี่ด้วย คุณสามารถเล่นซอกับมันเพื่อให้ยากหรือง่ายเท่าที่คุณต้องการ โปรดทราบว่าคุณควรวางคิวบ์ที่ต่ำที่สุดของคุณให้สูงพอที่จะทำให้ Uniduino เริ่มต้นได้ การแพ้เกมก่อนที่คุณจะสามารถเคลื่อนที่ได้อาจเป็นเรื่องที่น่าหงุดหงิด!

โครงการที่เสร็จสิ้น

ตอนนี้เมื่อคุณกดเล่น ลูกบาศก์จะวางไข่เหนือคุณและตกลงมา คุณสามารถใช้โพเทนชิออมิเตอร์เพื่อหลีกเลี่ยงสิ่งเหล่านี้ และปุ่มของคุณเพื่อทำให้เวลาช้าลง

ในโครงการนี้ เราได้สร้างคอนโทรลเลอร์แบบกำหนดเองด้วย Arduino กำหนดค่า Unity และ Uniduino เพื่อสื่อสารกับมัน และสร้างเกมง่ายๆ เพื่อทดสอบ แนวคิดที่นี่สามารถนำไปใช้กับเกือบทุกโครงการและมีแม้กระทั่ง เกมติดขัดที่เชี่ยวชาญในตัวควบคุมแบบกำหนดเอง .

ด้วย Arduino และ Unity คุณสามารถสร้างตัวควบคุมแบบกำหนดเองได้จากเกือบทุกอย่าง คุณได้สร้างไฮไฟที่ควบคุมยานอวกาศหรือไม่? เครื่องปิ้งขนมปังที่ควบคุมเกมแพลตฟอร์ม?

ถ้าคุณเคยทำโครงการแบบนี้ ฉันอยากเห็นมัน! โพสต์ไว้ในความคิดเห็นด้านล่าง!

แบ่งปัน แบ่งปัน ทวีต อีเมล 6 ทางเลือกที่ได้ยิน: แอพหนังสือเสียงฟรีหรือราคาถูกที่ดีที่สุด

หากคุณไม่ต้องการจ่ายค่าหนังสือเสียง นี่คือแอพดีๆ ที่ให้คุณฟังได้ฟรีและถูกกฎหมาย

อ่านต่อไป
หัวข้อที่เกี่ยวข้อง
  • DIY
  • การเขียนโปรแกรม
  • Arduino
  • เกมคอนโทรลเลอร์
  • การพัฒนาเกม
เกี่ยวกับผู้เขียน เอียน บัคลี่ย์(216 บทความที่ตีพิมพ์)

Ian Buckley เป็นนักข่าวอิสระ นักดนตรี นักแสดง และโปรดิวเซอร์วิดีโอที่อาศัยอยู่ในกรุงเบอร์ลิน ประเทศเยอรมนี เมื่อเขาไม่ได้เขียนหนังสือหรืออยู่บนเวที เขากำลังซ่อมแซมอุปกรณ์อิเล็กทรอนิกส์หรือโค้ด DIY โดยหวังว่าจะเป็นนักวิทยาศาสตร์ที่คลั่งไคล้

เพิ่มเติมจาก Ian Buckley

สมัครรับจดหมายข่าวของเรา

เข้าร่วมจดหมายข่าวของเราสำหรับเคล็ดลับทางเทคนิค บทวิจารณ์ eBook ฟรี และดีลพิเศษ!

คลิกที่นี่เพื่อสมัครสมาชิก
หมวดหมู่ Diy