ในบทช่วยสอนของ Appual ก่อนหน้านี้ที่ชื่อว่า “วิธีสร้างเกมแพลตฟอร์ม Unity ขั้นพื้นฐาน” (และตอนที่ 2) เราลองใช้ Unity และปลั๊กอิน WebGL ในตัวเพื่อสร้างเกมเบราว์เซอร์ที่ใช้ HTML5 อย่างง่าย – ในบทช่วยสอนที่คล้ายกันนี้ เราจะพูดถึงวิธีสร้าง Android basic พื้นฐาน เกมโดยใช้ความสามัคคี
ข้อกำหนด:
- ความสามัคคี
- โปรแกรมแก้ไขข้อความที่ดี เช่น NotePad++ (ไม่บังคับ แต่แนะนำ)
- Android SDK
เปิดตัว Unity และสร้างโครงการใหม่ ทำให้เป็นโครงการ 2 มิติ
มีหลายแผงที่ต้องทำความคุ้นเคย – แผงลำดับชั้นซึ่งจะมีองค์ประกอบฉากทั้งหมดของเรา (ฉาก ="ระดับ" ใดก็ตามที่คุณกำลังดำเนินการอยู่) จากนั้นจะมีแท็บ Game ที่ใช้สำหรับเล่น/ทดสอบเกมของคุณขณะอยู่ในเครื่องมือแก้ไข และทางด้านขวาจะมีแผง Inspector ซึ่งเป็นที่ที่คุณจะแก้ไขสิ่งต่างๆ เช่น แสง ฟิสิกส์ ฯลฯ
สิ่งแรกที่เราต้องการทำคือสร้างสไปรต์ - นี่จะเป็นตัวละครหลักของเรา (ที่เราควบคุม) คุณสามารถวาดสไปรท์ของคุณเองได้ เช่น วาดสี่เหลี่ยมด้วยตา หรือจะหยิบสไปรต์จากอินเทอร์เน็ตก็ได้ เพียงตรวจสอบให้แน่ใจว่าไฟล์นั้นเป็นไฟล์ .PNG (พื้นหลังโปร่งใส)
ลากและวางสไปรท์ของคุณไปที่หน้าต่างฉากหลัก (หน้าต่างที่ใหญ่ที่สุด) – มันจะปรากฏบนแผงลำดับชั้นทางด้านซ้ายด้วย
ตอนนี้เราจะสร้างแพลตฟอร์มสองสามแห่ง ซึ่งอาจเป็นสี่เหลี่ยมจัตุรัสธรรมดาก็ได้ เพราะเราจะปรับขนาดพวกมันเพื่อสร้างกำแพงและแพลตฟอร์มอื่นๆ ได้อย่างง่ายดาย
ดังนั้นเพียงแค่สร้าง “สไปรท์” สี่เหลี่ยมใหม่แล้วลากและวางลงในหน้าต่างฉากเหมือนที่คุณทำกับตัวละครสไปรท์ของคุณ
ตอนนี้ เราต้องสั่ง Unity เพื่อให้ฟิสิกส์กับตัวละครหลักของเรา - คลิกที่ตัวละครสไปรท์หลักของคุณ (ควรเน้นเป็นสีน้ำเงินในหน้าต่างฉาก) จากนั้นบนแผง Inspector ให้มองหา "GameObjects"
คลิกที่ “เพิ่มส่วนประกอบ> ฟิสิกส์ 2 มิติ> RigidBody2D” สิ่งนี้จะเพิ่มฟิสิกส์ให้กับสไปรท์ของคุณโดยอัตโนมัติ ซึ่งคุณจะต้องเขียนสคริปต์เองใน SDK อื่น
เราต้องการป้องกันไม่ให้ตัวละครสไปรต์หลักหมุนไปรอบ ๆ นอกเหนือการควบคุม ดังนั้นให้ค้นหาแท็บข้อจำกัดในแผงตัวตรวจสอบ (โดยที่สไปรท์หลักยังคงถูกเน้นในหน้าต่างฉาก) และทำเครื่องหมายที่ช่อง "หยุดการหมุน Z"พี>
หากคุณกดปุ่ม "เล่น" ตัวละครสไปรท์หลักของคุณควรตกลงมาจากฟากฟ้าและตกลงไปอย่างไม่รู้จบ – เราจะดูแลเรื่องนั้นในภายหลัง แต่ให้สังเกตว่าเราสามารถใช้ฟิสิกส์ได้ง่ายเพียงใด ฟิสิกส์ที่เราใช้จะขึ้นอยู่กับรูปร่างที่นำไปใช้ ตัวอย่างเช่น หากคุณใช้ฟิสิกส์แบบเดียวกันกับทรงกลม ทรงกลมก็จะหมุนไปรอบๆ
เรายังต้องการแก้ไขการวางแนวของเราเพื่อป้องกันไม่ให้ตัวละครหมุนและหมุนไปมาอย่างอิสระ ค้นหา 'ข้อจำกัด' ในตัวตรวจสอบโดยเลือกผู้เล่นไว้แล้วและทำเครื่องหมายที่ช่องเพื่อหยุดการหมุน Z จากนั้นคลิกเล่นอีกครั้งและคุณควรพบว่าผู้เล่นของคุณตกลงจากฟากฟ้าไปสู่ความหายนะที่ไม่มีที่สิ้นสุด
เพื่อป้องกันไม่ให้ตัวละครสไปรท์หลักของเราล้มลงอย่างไม่รู้จบ เราจะต้องเพิ่ม collider นี่เป็นเพียงโครงร่างทึบของรูปร่างที่เราจะเพิ่มให้กับตัวละครสไปรท์หลัก เน้นอักขระสไปรท์หลักของคุณ คลิก “เพิ่มส่วนประกอบ> Physics 2D> BoxCollider2D
ตอนนี้ทำสิ่งเดียวกันกับแพลตฟอร์มที่คุณสร้างไว้ก่อนหน้านี้ ตัวละครสไปรต์หลักของคุณควร "ชน" กับแพลตฟอร์มและอยู่ที่นั่น
ตอนนี้เราต้องการให้แน่ใจว่ากล้องจะติดตามตัวละครสไปรท์หลักของคุณ – ในฉาก ควรมีวัตถุกล้องอยู่แล้ว คุณต้องการลาก นี้ไปไว้บน ตัวละครสไปรท์หลัก
นี่เป็นสิ่งสำคัญอย่างยิ่งหากคุณกำลังสร้าง นักวิ่งแบบ 3 มิติ บางอย่างเช่น Slope ที่คุณต้องการให้กล้องอยู่ด้านหลังวัตถุหลักในเกมอย่างต่อเนื่อง (ตัวละครสไปรท์หลักของคุณ)
ไปที่แผงลำดับชั้น และในรายการ GameObjects คุณต้องการลากกล้อง ใต้ ตัวละครสไปรท์หลัก (Player GameObject) สิ่งนี้จะทำให้ตัวละครสไปรต์หลักเป็น 'parent' ของกล้อง ดังนั้นเมื่อใดก็ตามที่ Player GameObject เคลื่อนที่ไปรอบๆ หน้าจอ กล้องควรติดตาม
ดังนั้นสำหรับบทช่วยสอนเกมนี้ เราจะสร้างเกมประเภทวิ่งพื้นฐานที่ไม่มีที่สิ้นสุด บางอย่างเช่น Run 3 ซึ่งตัวละครหลักของคุณจะวิ่งผ่านหน้าจอและหลบสิ่งกีดขวาง (หรือ "จบเกม" หากคุณชนสิ่งกีดขวาง” จะใช้เวลาสองสามสคริปต์ ซึ่งส่วนใหญ่จะมีอยู่ในคู่มือนี้
คลิกขวาที่โฟลเดอร์ “เนื้อหา” และสร้างโฟลเดอร์ใหม่ – ตั้งชื่อเป็น สคริปต์ . ตอนนี้คลิกขวาที่โฟลเดอร์ใหม่นี้แล้วกด "สร้าง> C # Script" และตั้งชื่อเป็น PlayerControls . สคริปต์นี้จะกำหนดพฤติกรรมของตัวละครสไปรท์หลักของเรา
เมื่อคุณดับเบิลคลิกที่สคริปต์ใหม่นี้ มัน ควร เปิดใน Visual Studio – หรือ (และความชอบส่วนตัวของฉัน) คุณสามารถแก้ไขได้ในบางอย่างเช่น NotePad++
ไฟล์สคริปต์ควรมีโค้ด "แผ่นหม้อต้ม" อยู่ข้างในอยู่แล้ว โดยพื้นฐานแล้วนี่คือสคริปต์ที่ต้องทิ้งไว้ตามลำพังหรือปรับให้เข้ากับความต้องการของคุณ และจะช่วยเราประหยัดเวลาได้มาก เราจะเพิ่มวัตถุใหม่
เหนือบรรทัดเป็นโมฆะ Start():
สาธารณะ Rigidbody2D rb;
โค้ดส่วนถัดไปที่เราต้องเพิ่มจะอยู่ภายใน Start() และจะใช้เพื่อค้นหา hardbody โดยพื้นฐานแล้ว เรากำลังสั่งให้ Unity ค้นหาตำแหน่งฟิสิกส์ที่เราแนบมากับ GameObjects (ตัวละครสไปรต์หลักของเรา) และ Start () จะถูกดำเนินการเมื่อมีการสร้างวัตถุหรือสคริปต์ใหม่
ต่อไป ค้นหาวัตถุฟิสิกส์
rb = GetComponent<Rigidbody2D>();
และคุณจะเพิ่มบรรทัดนี้ใน Update()
rb.velocity = new Vector2(3, rb.velocity.y);
สิ่งที่ Update() ทำคือการรีเฟรชอย่างต่อเนื่อง ดังนั้นโค้ดใดๆ ที่เพิ่มเข้าไปจะทำงานอย่างต่อเนื่อง (เว้นแต่ว่าอ็อบเจกต์จะถูกทำลาย) ดังนั้นสิ่งที่เราทำคือสั่งสคริปต์ว่าเราต้องการให้ rigidbody มีเวกเตอร์ใหม่โดยใช้ความเร็วเท่ากันบนแกน Y (rb.velocity.y) แต่ด้วยความเร็ว 3 บนแกนนอน ในอนาคต คุณยังสามารถใช้ 'FixedUpdate()' ซึ่งคล้ายกันแต่ต่างกันเพราะที่นั่นคุณสามารถควบคุมจำนวนการอัพเดท / รีเฟรชของสคริปต์ได้
บันทึกสคริปต์และกลับไปที่ Unity จากนั้นคลิกอักขระสไปรท์หลักของคุณเพื่อไฮไลต์ ในแผง Inspector ให้ไปที่ Add Component> Scripts และเพิ่มสคริปต์ที่เราเพิ่งบันทึก ตอนนี้เมื่อคุณคลิกปุ่มเล่น ตัวละครสไปรท์หลักควรเคลื่อนเข้าหาขอบแพลตฟอร์มอย่างต่อเนื่อง
การสร้างการควบคุมอินพุตของผู้เล่น
เนื่องจากเกมนี้เป็นเกมวิ่งสไตล์รันเนอร์ที่มีอุปสรรค เราจึงต้องเพิ่มการควบคุมสำหรับผู้เล่น เช่น ปุ่ม "กระโดด"
เปิดสคริปต์อีกครั้งจากเมื่อก่อน และเราจะเพิ่มโค้ดเพิ่มเติมนี้:
if (Input.GetMouseButtonDown(0)) { rb.velocity = new Vector2(rb.velocity.x, 5); }
คุณจะต้องใส่สิ่งนั้นในวิธี Update() และสิ่งที่มันทำคือบอก Unity ว่าเมื่อผู้เล่นคลิกปุ่มเมาส์ (ซึ่งจะแปลว่าเป็นการแตะหน้าจอบน Android) อักขระสไปรท์หลักจะ "กระโดด " ในอากาศ. เนื่องจากเราได้เพิ่มความเร็วบนแกน Y ด้วยค่า 5 (ค่าที่สูงกว่าย่อมหมายถึงการกระโดดที่สูงขึ้นแน่นอน)
หากคุณไม่คุ้นเคยกับการเขียนโค้ดมากเกินไป เราใช้ ถ้า คำสั่งเพราะ ถ้า โดยพื้นฐานแล้วเป็นคำสั่งประเภท "ทำหรือไม่ทำ" - มันบอกว่า ถ้าสิ่งนี้เกิดขึ้น ให้ทำคำสั่งนี้ . ดังนั้นหากผู้เล่นไม่คลิกเมาส์ (หรือแตะหน้าจอ Android) สคริปต์จะไม่ทำงานอย่างชัดเจน
ไปข้างหน้าและคลิกปุ่ม "เล่น" และตรวจสอบให้แน่ใจว่าทำงานได้อย่างถูกต้องก่อนดำเนินการต่อ
ต่อไป เราจะเพิ่มสิ่งกีดขวางของเรา (ซึ่งสามารถ "ทำลาย" สไปรต์ของตัวละครหลักได้) คะแนนของเกม และเมนู "จบเกม"
หากคุณทดสอบเกมจนถึงตอนนี้ ปัญหาเดียวที่เรามีคือ การกดปุ่ม "กระโดด" ที่เราสร้างขึ้นจะทำให้ตัวละครกระโดดได้ ไม่ว่าพวกมันจะถูกต่อสายดินหรือไม่ก็ตาม นี่คือเกม Flappy Birds ไม่ใช่นักวิ่งอย่าง พวกเราต้องการ. แต่เรากำลังจะแก้ไขมัน
ในสคริปต์ เพิ่มโค้ดนี้ ด้านบน วิธีการ Update():
public Transform groundCheck; public Transform startPosition; public float groundCheckRadius; public LayerMask whatIsGround; private bool onGround; And then add this next line to the Update method above the if statement: onGround = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, whatIsGround); And next you will change this following line to include “&& onGround” if (Input.GetMouseButtonDown(0) && onGround) { So our entire script should basically look like this: public class PlayerControls : MonoBehaviour { public Rigidbody2D rb; public Transform groundCheck; public Transform startPosition; public float groundCheckRadius; public LayerMask whatIsGround; private bool onGround; void Start() { rb = GetComponent<Rigidbody2D>(); } void Update() { rb.velocity = new Vector2(3, rb.velocity.y); onGround = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, whatIsGround); if (Input.GetMouseButtonDown(0) && onGround) { rb.velocity = new Vector2(rb.velocity.x, 5); } } }
เพื่ออธิบายสิ่งที่เราได้ทำลงไป เราได้สร้าง "การเปลี่ยนแปลง" ใหม่ ซึ่งหมายถึงตำแหน่งในอวกาศของโลกของเกม เราได้กำหนดรัศมีของมันแล้ว และกำลังสั่งให้ Unity ตรวจสอบว่ารัศมีนั้นทับซ้อนกับเลเยอร์ "พื้น" ของเราหรือไม่ ดังนั้นหากรัศมีของเราประสานกับ "พื้น" ตัวละครของเราจะกระโดดได้ และถ้าเรา กระโดดขึ้นไปในอากาศแล้ว เราไม่น่าจะกระโดดได้อีก โดยทั่วไป onGround จะเป็นจริง ถ้า การแปลงชื่อ groundCheck จะทับซ้อนกับชั้นดิน หวังว่าคงจะสมเหตุสมผลนะ
ดังนั้นให้บันทึกสคริปต์และกลับไปที่ Unity แล้วคุณจะเห็นว่ามีตัวเลือกเพิ่มเติมใน Inspector หลังจากไฮไลต์โปรแกรมเล่นแล้ว สิ่งเหล่านี้เป็นตัวแปรสาธารณะและเราสามารถปรับสิ่งเหล่านี้ได้ตามใจชอบ
ตอนนี้ให้คลิกขวาที่ลำดับชั้น และสร้างวัตถุว่างใหม่ แล้วลากไปไว้ใต้สไปรท์ของตัวละครหลักในหน้าต่าง Scene หลัก - วางตำแหน่งวัตถุว่างนี้ในตำแหน่งที่เราต้องการให้ตรวจจับพื้น เปลี่ยนชื่อวัตถุเป็น "Check Ground" จากนั้นลากไปข้างใต้วัตถุเกมของผู้เล่นเหมือนที่เราทำก่อนหน้านี้ด้วยกล้อง (เพื่อสร้างความสัมพันธ์ระหว่างผู้ปกครองและเด็กระหว่างวัตถุ) ตอนนี้วัตถุที่ว่างเปล่าจะติดตามสไปรต์ของตัวละครหลักเช่นเดียวกับกล้อง และจะตรวจสอบระยะห่างของพื้นกล้องอย่างต่อเนื่อง
ตอนนี้เลือกสไปรต์ของตัวละครหลักและไปที่แผง Inspector - ลากวัตถุ Check Ground ลงในช่องว่างที่เรียกว่า "groundCheck" ตำแหน่ง "แปลง" ควรเท่ากับตำแหน่งของวัตถุใหม่นี้ และตำแหน่งที่ระบุว่า "รัศมี" ให้เป็น 0.1
เราจำเป็นต้องกำหนดชั้นพื้นดิน เพียงเลือกภูมิประเทศพื้นดินและในตัวตรวจสอบ ค้นหาปุ่มสำหรับ "เลเยอร์:ค่าเริ่มต้น" (เป็นช่องแบบเลื่อนลง) แล้วเลือก "เพิ่มเลเยอร์"
ตอนนี้เลือก "กราวด์" เป็นเลเยอร์สำหรับแพลตฟอร์มของเรา และทำซ้ำสำหรับแพลตฟอร์มอื่นๆ ในหน้าต่างเกม ตำแหน่งที่ระบุว่า "อะไรคือกราวด์" บนออบเจกต์สไปรท์ของตัวละครหลักของเรา ให้เลือกเลเยอร์กราวด์ด้วย
สิ่งที่เราได้ทำคือสั่งให้สคริปต์ผู้เล่นทำการตรวจสอบ – ถ้า จุดเล็ก ๆ บนหน้าจอซ้อนทับกับสิ่งที่ตรงกับเลเยอร์ ตัวละครจะกระโดดก็ต่อเมื่อเป็นจริงเท่านั้น
จบเกมด้วยการชนกันและเมนูเกม
เพื่อสรุปสิ่งสุดท้ายที่เราต้องการทำคือ A:การชนกับสิ่งกีดขวางส่งผลให้เกมจบลง และ B:สร้างหน้าจอเมนู "จบเกม" ด้วยปุ่มเล่นอีกครั้ง
สิ่งที่คุณต้องการทำโดยทั่วไปคือ:
- เพิ่ม ผู้เล่น ออบเจ็กต์และกำหนด rigidbody และ คอลไลเดอร์ ที่คุณเลือกได้
- เพิ่ม ศัตรู ออบเจ็กต์และกำหนด rigidbody และ คอลไลเดอร์ ที่คุณเลือกได้ (และไม่บังคับ ให้เพิ่ม แท็ก "ศัตรู" ไป)
- สร้าง สคริปต์ C# ใหม่ และเพิ่มเป็นส่วนประกอบให้กับ ผู้เล่น (หรือใช้สคริปต์ใด ๆ ที่แนบมากับผู้เล่นไม่จำเป็นต้องสร้างใหม่ถ้าคุณมีอยู่แล้ว)
- เพิ่มสิ่งนี้ในสคริปต์ของคุณ:
void OnCollisionEnter(Collision coll){ Debug.Log("Collision"); //Check to see if it even registers a collision, if it works you can remove this line if(coll.gameobject.tag == "Enemy"){ //sees if the object your player collided with has a tag called "Enemy", this can be replaced with if(coll.gameobject.name == ... but using a tag is an easy way to do it. //Add your code here, like: Application.LoadLevel("GameOver"); Debug.Log("Working"); //if working, you can remove this line. }
ลองใช้สคริปต์ตัวอย่างนั้น – ด้วยการลองผิดลองถูก คุณจะทำให้มันทำสิ่งที่เราต้องการได้อย่างแท้จริง
ตอนนี้หากต้องการทราบวิธีการสร้าง "ระดับ" ของ GameOver ด้วยปุ่มเล่น โปรดดูส่วนสุดท้ายของคู่มือ Appual "วิธีสร้างเกมพื้นฐาน Unity Platform เกม Pt. 2”.