วิธีสร้างเกม Android พื้นฐานด้วย Unity

ในบทช่วยสอนที่คล้ายกันนี้เราจะพูดถึงวิธีการสร้างพื้นฐาน Android เกมโดยใช้ Unity



ข้อกำหนด:

  • ความสามัคคี
  • โปรแกรมแก้ไขข้อความที่ดีเช่น NotePad ++ (ไม่บังคับ แต่แนะนำ)
  • Android SDK
หากคุณยังไม่มีคุณควรเริ่มต้นด้วยการดาวน์โหลดและติดตั้ง Unity SDK และ Android SDK เราต้องการ Android SDK เพื่อให้เราสามารถทดสอบ APK ของเกมภายในสภาพแวดล้อม Android

เปิด Unity และสร้างโครงการใหม่ ทำให้เป็นโครงการ 2 มิติ



มีแผงควบคุมหลายแผงที่ต้องทำความคุ้นเคย - แผงลำดับชั้นซึ่งจะมีองค์ประกอบฉากทั้งหมดของเรา (ฉาก = ไม่ว่า 'ระดับใดก็ตามที่คุณกำลังดำเนินการอยู่) จากนั้นจะมีแท็บเกมซึ่งใช้สำหรับเล่น / ทดสอบเกมของคุณในขณะที่อยู่ในตัวแก้ไขและทางด้านขวาคุณจะมีแผงสารวัตรซึ่งเป็นที่ที่คุณจะแก้ไขสิ่งต่างๆเช่นแสงฟิสิกส์ ฯลฯ



สิ่งแรกที่เราต้องทำคือสร้างสไปรท์ - นี่จะเป็นตัวละครหลักของเรา (ที่เราควบคุม) คุณสามารถวาดสไปรต์ของคุณเองได้เช่นวาดรูปสี่เหลี่ยมจัตุรัสด้วยตาหรือจะหยิบสไปรท์จากอินเทอร์เน็ตก็ได้เพียงแค่ตรวจสอบว่าเป็นไฟล์. PNG



ลากและวางสไปรต์ของคุณไปยังหน้าต่างฉากหลัก (หน้าต่างที่ใหญ่ที่สุด) - จะปรากฏบนแผงลำดับชั้นทางด้านซ้าย

ตอนนี้เราจะสร้างแพลตฟอร์มสองสามแพลตฟอร์มซึ่งอาจเป็นสี่เหลี่ยมธรรมดาก็ได้เพราะเราจะสามารถปรับขนาดเพื่อสร้างกำแพงและแพลตฟอร์มอื่น ๆ ได้อย่างง่ายดาย

ดังนั้นเพียงแค่สร้าง 'สไปรต์' สี่เหลี่ยมใหม่แล้วลากและวางลงบนหน้าต่างฉากเหมือนที่คุณทำกับตัวละครสไปรท์ของคุณ



ตอนนี้เราจำเป็นต้องสั่งให้ Unity มอบฟิสิกส์ให้กับตัวละครหลักของเรา - คลิกที่ตัวละครสไปรท์หลักของคุณ (ควรเน้นเป็นสีน้ำเงินในหน้าต่างฉาก) จากนั้นบนแผงสารวัตรให้มองหา“ GameObjects”

คลิกที่“ Add Component> Physics 2D> RigidBody2D” การดำเนินการนี้จะเพิ่มฟิสิกส์ให้กับสไปรต์ของคุณโดยอัตโนมัติซึ่งคุณจะต้องเขียนสคริปต์ตัวเองใน SDK อื่น

เราต้องการป้องกันไม่ให้ตัวละครสไปรท์หลักหมุนไปโดยไม่สามารถควบคุมได้ - ดังนั้นให้ค้นหาแท็บข้อ จำกัด ในแผงตัวตรวจสอบ (โดยที่สไปรท์หลักยังคงไฮไลต์อยู่ในหน้าต่างฉาก) และทำเครื่องหมายที่ช่อง 'ตรึงการหมุน Z'

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

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

เพื่อที่จะหยุดตัวละครสไปรท์หลักของเราจากการล้มตายอย่างไม่มีที่สิ้นสุดเราจำเป็นต้องเพิ่มตัวเชื่อมต่อ โดยพื้นฐานแล้วนี่เป็นเพียงโครงร่างที่มั่นคงของรูปทรงซึ่งเราจะเพิ่มเข้าไปในอักขระสไปรท์หลัก เน้นตัวละครสไปรต์หลักของคุณคลิก“ เพิ่มส่วนประกอบ> ฟิสิกส์ 2D> BoxCollider2D

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

ตอนนี้เราต้องการให้แน่ใจว่ากล้องจะติดตามตัวละครสไปรท์หลักของคุณ - ภายในฉากควรมีวัตถุกล้องอยู่แล้ว คุณต้องการลากสิ่งนี้ ด้านบนของ ตัวละครสไปรท์หลัก

นี่เป็นสิ่งสำคัญอย่างยิ่งหากคุณกำลังสร้างไฟล์ นักวิ่งที่ใช้ 3D , สิ่งที่ต้องการ ความลาดชัน ที่คุณต้องการให้กล้องอยู่หลังวัตถุหลักของเกมตลอดเวลา (ตัวละครสไปรท์หลักของคุณ)

ตอนนี้ไปที่แผงลำดับชั้นและในรายการ GameObjects คุณต้องการลากกล้อง ภายใต้ ตัวละครสไปรท์หลัก (ผู้เล่น GameObject) สิ่งนี้จะทำให้ตัวละครสไปรท์หลักเป็น ' parent ’ ของกล้อง ดังนั้นเมื่อใดก็ตามที่ Player GameObject เคลื่อนที่ไปรอบ ๆ หน้าจอกล้องก็ควรทำตาม

ดังนั้นสำหรับบทช่วยสอนเกมนี้เราจะสร้างเกมประเภทนักวิ่งที่ไม่มีที่สิ้นสุดขั้นพื้นฐานเช่น เรียกใช้ 3 ซึ่งตัวละครหลักของคุณจะวิ่งผ่านหน้าจอและหลบสิ่งกีดขวาง (หรือ“ จบเกม” หากคุณชนสิ่งกีดขวาง” ซึ่งจะต้องใช้สคริปต์บางส่วนซึ่งส่วนใหญ่จะมีอยู่ในคู่มือนี้

คลิกขวาที่โฟลเดอร์“ Assets” และสร้างโฟลเดอร์ใหม่ - ตั้งชื่อ สคริปต์ . ตอนนี้คลิกขวาที่โฟลเดอร์ใหม่นี้และกด 'Create> C # Script' และตั้งชื่อ PlayerControls . สคริปต์นี้จะกำหนดพฤติกรรมของตัวละครสไปรต์หลักของเรา

เมื่อคุณดับเบิลคลิกที่สคริปต์ใหม่นี้ ควร เปิดขึ้นใน Visual Studio - หรือ (และความชอบส่วนตัวของฉัน) คุณสามารถแก้ไขได้ในบางอย่างเช่น NotePad ++

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

เหนือเส้นเป็นโมฆะ Start ():

สาธารณะ Rigidbody2D rb;

โค้ดถัดไปที่เราต้องเพิ่มจะอยู่ใน Start () และใช้เพื่อค้นหาตัวแข็ง - โดยพื้นฐานแล้วเรากำลังสั่งให้ Unity ค้นหาฟิสิกส์ที่เราแนบมากับ GameObjects (ตัวละครสไปรท์หลักของเรา) และ Start () จะถูกดำเนินการเมื่อมีการสร้างวัตถุหรือสคริปต์ใหม่

ต่อไปให้ค้นหาวัตถุฟิสิกส์

rb = GetComponent< Rigidbody2D > ();

และคุณจะเพิ่มบรรทัดนี้ใน Update ()

rb.velocity = ใหม่ Vector2 (3, rb.velocity.y);

สิ่งที่ Update () ทำการรีเฟรชอย่างต่อเนื่องดังนั้นโค้ดใด ๆ ที่เพิ่มเข้าไปจะทำงานอย่างต่อเนื่อง (เว้นแต่วัตถุจะถูกทำลาย) สิ่งที่เราทำคือสั่งสคริปต์ว่าเราต้องการให้ตัวแข็งมีเวกเตอร์ใหม่โดยใช้ความเร็วเท่ากันบนแกน Y (rb.velocity.y) แต่ด้วยความเร็ว 3 บนแกนแนวนอน ในอนาคตคุณยังสามารถใช้ ‘ FixedUpdate () ’ ซึ่งคล้ายกัน แต่แตกต่างกันเนื่องจากคุณสามารถควบคุมปริมาณการอัปเดต / รีเฟรชของสคริปต์ได้

บันทึกสคริปต์และกลับไปที่ Unity จากนั้นคลิกตัวละครสไปรท์หลักของคุณเพื่อไฮไลต์ ในแผงตัวตรวจสอบไปที่เพิ่มคอมโพเนนต์> สคริปต์และเพิ่มสคริปต์ที่เราเพิ่งบันทึก ตอนนี้เมื่อคุณคลิกปุ่มเล่นตัวละครสไปรท์หลักควรเคลื่อนไปที่ขอบแพลตฟอร์มอย่างต่อเนื่อง

การสร้างตัวควบคุมอินพุตของผู้เล่น

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

เปิดสคริปต์ใหม่จากก่อนหน้านี้และเราจะเพิ่มโค้ดเพิ่มเติมนี้:

 ถ้า (Input.GetMouseButtonDown (0)) {rb.velocity = ใหม่ Vector2 (rb.velocity.x, 5); }

คุณจะใส่สิ่งนั้นไว้ในเมธอด Update () และสิ่งที่ทำโดยทั่วไปคือบอก Unity ว่าเมื่อผู้เล่นคลิกปุ่มเมาส์ (ซึ่งจะแปลว่าเป็นการแตะหน้าจอบน Android) ตัวละครสไปรท์หลักจะ 'กระโดด ' ในอากาศ. นี่เป็นเพราะเราได้เพิ่มความเร็วบนแกน Y ด้วยค่า 5 (แน่นอนว่าค่าที่สูงกว่าจะหมายถึงการกระโดดที่สูงขึ้น)

หากคุณไม่คุ้นเคยกับการเขียนโค้ดเราใช้ไฟล์ ถ้า คำสั่งเพราะ ถ้า โดยพื้นฐานแล้วเป็นคำสั่งประเภท“ ทำหรือไม่ทำ” - เป็นการบอกอย่างแท้จริง หากสิ่งนี้เกิดขึ้นให้ทำตามคำสั่งนี้ . ดังนั้นหากผู้เล่นไม่คลิกเมาส์ (หรือแตะหน้าจอ Android) สคริปต์จะไม่ทำงานอย่างเห็นได้ชัด

ไปข้างหน้าและคลิกปุ่ม 'เล่น' และตรวจสอบให้แน่ใจว่าทำงานได้อย่างถูกต้องก่อนดำเนินการต่อ

ต่อไปเราจะเพิ่มอุปสรรคของเรา (ซึ่งสามารถ 'ทำลาย' สไปรท์ตัวละครหลัก) คะแนนเกมและเมนู 'จบเกม'

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

ในสคริปต์ให้เพิ่มรหัสนี้ ข้างบน วิธีการอัปเดต ():

 สาธารณะ แปลง groundCheck; สาธารณะ เปลี่ยน startPosition; สาธารณะ   ลอย groundCheckRadius; สาธารณะ LayerMask whatIsGround; เอกชน   บูล บนพื้น; จากนั้นเพิ่มบรรทัดถัดไปนี้ในวิธีการอัปเดตด้านบน ถ้า คำสั่ง: onGround = Physics2D.OverlapCircle (groundCheck.position, groundCheckRadius, whatIsGround); และถัดไปคุณจะเปลี่ยนบรรทัดต่อไปนี้เพื่อรวม“ && onGround” ถ้า (Input.GetMouseButtonDown (0) && onGround) {ดังนั้นโดยพื้นฐานแล้วสคริปต์ทั้งหมดของเราควรมีลักษณะดังนี้: สาธารณะ   ชั้นเรียน   PlayerControls : โมโน Behaviour { สาธารณะ Rigidbody2D rb; สาธารณะ แปลง groundCheck; สาธารณะ เปลี่ยน startPosition; สาธารณะ   ลอย groundCheckRadius; สาธารณะ LayerMask whatIsGround; เอกชน   บูล บนพื้น; เป็นโมฆะ   เริ่ม () {rb = GetComponent (); } เป็นโมฆะ   อัปเดต () {rb.velocity = ใหม่ Vector2 (3, rb.velocity.y); onGround = Physics2D.OverlapCircle (groundCheck.position, groundCheckRadius, whatIsGround); ถ้า (Input.GetMouseButtonDown (0) && onGround) {rb.velocity = ใหม่ Vector2 (rb.velocity.x, 5); }}}

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

ดังนั้นบันทึกสคริปต์และกลับไปที่ Unity และคุณจะสังเกตเห็นว่ามีการเพิ่มตัวเลือกเพิ่มเติมให้กับ Inspector หลังจากไฮไลต์โปรแกรมเล่นแล้ว สิ่งเหล่านี้เป็นตัวแปรสาธารณะและเราสามารถปรับเปลี่ยนสิ่งเหล่านี้ได้ตามที่เราต้องการ

ตอนนี้คลิกขวาที่ลำดับชั้นและสร้างวัตถุว่างใหม่จากนั้นลากเพื่อให้วัตถุนั้นอยู่ใต้สไปรท์ตัวละครหลักในหน้าต่างฉากหลัก - วางตำแหน่งวัตถุว่างนี้ที่เราต้องการให้ตรวจพบพื้น เปลี่ยนชื่อวัตถุเป็น“ Check Ground” จากนั้นลากไปที่ใต้วัตถุในเกมของผู้เล่นเหมือนที่เราทำกับกล้องก่อนหน้านี้ (เพื่อสร้างความสัมพันธ์ระหว่างผู้ปกครอง - ลูกระหว่างวัตถุ) ตอนนี้วัตถุว่างจะติดตามสไปรต์ตัวละครหลักเช่นเดียวกับกล้องและจะตรวจสอบระยะทางอย่างต่อเนื่องกล้อง

ตอนนี้เลือกสไปรต์ตัวละครหลักและไปที่แผงสารวัตร - ลากวัตถุ Check Ground ลงในช่องว่างที่เรียกว่า 'groundCheck' ตำแหน่ง 'การเปลี่ยนแปลง' ควรเท่ากับตำแหน่งของวัตถุใหม่นี้และตำแหน่งที่ระบุว่า 'รัศมี' ทำให้เป็น 0.1

เราจำเป็นต้องกำหนดชั้นพื้นดิน เพียงแค่เลือกภูมิประเทศภาคพื้นดินและในตัวตรวจสอบค้นหาปุ่มสำหรับ“ Layer: Default” (เป็นช่องแบบเลื่อนลง) แล้วเลือก“ เพิ่มเลเยอร์”

ตอนนี้เลือก 'พื้น' เป็นเลเยอร์สำหรับแพลตฟอร์มของเราและทำซ้ำสำหรับแพลตฟอร์มอื่น ๆ ในหน้าต่างเกม ในกรณีที่ระบุว่า“ Ground คืออะไร” บนวัตถุสไปรต์ตัวละครหลักของเราให้เลือกชั้นพื้นดินด้วย

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

จบเกมด้วยการชนกันและเมนูเกม

ดังนั้นเพื่อสรุปทั้งหมดสิ่งสุดท้ายที่เราต้องการทำคือ A: การชนกับสิ่งกีดขวางจะส่งผลให้เกมจบลงและ B: สร้างหน้าจอเมนู 'จบเกม' ด้วยปุ่มเล่นอีกครั้ง

สิ่งที่คุณต้องการทำโดยทั่วไปคือ:

  1. เพิ่ม ผู้เล่น วัตถุและกำหนดไฟล์ คนแข็ง และก collider ที่คุณเลือก
  2. เพิ่มไฟล์ ศัตรู วัตถุและกำหนดไฟล์ คนแข็ง และก collider ที่คุณเลือกให้มัน (และไม่บังคับเพิ่ม แท็ก“ ศัตรู” ไปเลย)
  3. สร้างไฟล์ สคริปต์ C # และเพิ่มเป็นส่วนประกอบของ ผู้เล่น (หรือใช้สคริปต์ใด ๆ ที่แนบมากับผู้เล่นไม่จำเป็นต้องสร้างใหม่หากคุณมีอยู่แล้ว)
  4. เพิ่มสิ่งนี้ในสคริปต์ของคุณ:
เป็นโมฆะ OnCollisionEnter ( การชนกัน coll) { แก้ไขข้อบกพร่อง . บันทึก ('การชนกัน'); // ตรวจสอบดูว่ามันลงทะเบียนการชนกันหรือไม่หากใช้งานได้คุณสามารถลบบรรทัดนี้ได้ ถ้า (coll.gameobject. แท็ก == 'ศัตรู') { // ดูว่าวัตถุที่ผู้เล่นชนกันมีแท็กชื่อ 'Enemy หรือไม่