Contents

วิธีเพิ่มวัตถุเคลื่อนที่แบบสุ่มใน Godot

Contents

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

ผู้ใช้อาจใช้ GDScript ซึ่งเป็นภาษาโปรแกรมดั้งเดิมของ Godot เพื่อให้บรรลุผลลัพธ์นี้ในขณะที่ร่วมมือกับ Godot

การตั้งค่าเกม Godot ของคุณ

ในการเริ่มต้น ให้สร้างบรรยากาศการเล่นเกมแบบสองมิติขั้นพื้นฐานภายในเอนจิ้นเกม Godot โดยการสร้างฉาก 2 มิติที่สดใหม่และรวมเอา

ซอร์สโค้ดที่ใช้ในสิ่งพิมพ์นี้สามารถเข้าถึงได้ผ่านที่เก็บ GitHub เฉพาะ ซึ่งให้สิทธิ์ผู้ใช้ในการใช้งานโดยไม่มีค่าใช้จ่ายภายใต้การอุปถัมภ์ของใบอนุญาต MIT

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

เพื่อเติมเต็มตัวละครด้วยความรู้สึกของการเคลื่อนไหว เราอาจใช้ข้อมูลโค้ดต่อไปนี้ที่เขียนด้วย GDScript:

 extends CharacterBody2D

var speed = 200

func _physics_process(delta):
    var velocity = Vector2()

    if Input.is_action_pressed('ui_right'):
        velocity.x \+= 1

    if Input.is_action_pressed('ui_left'):
        velocity.x -= 1

    if Input.is_action_pressed('ui_down'):
        velocity.y \+= 1

    if Input.is_action_pressed('ui_up'):
        velocity.y -= 1

    velocity = velocity.normalized() * speed
    move_and_collide(velocity * delta)

เพื่อสร้างความเร็วที่สม่ำเสมอสำหรับอวาตาร์ของผู้เล่นในทุกทิศทาง จำเป็นอย่างยิ่งที่จะต้องแนะนำตัวแปรที่มีชื่อ’ความเร็ว’ซึ่งจะทำหน้าที่เป็นความเร็วเริ่มต้นของตัวละครเมื่อผู้ใช้ป้อนข้อมูล ค่านี้สามารถปรับได้โดยการเรียกใช้ฟังก์ชัน’_physics\_process(delta)‘ซึ่งจะควบคุมการเคลื่อนที่ของตัวเอกตามการเปลี่ยนแปลงใดๆ ที่ทำกับจอยสติ๊กหรืออินพุตคีย์บอร์ด ด้วยการปรับความเร็วและทิศทางของตัวละครให้เป็นมาตรฐานก่อนที่จะใช้การปรับเปลี่ยนเหล่านี้ เราสร้างประสบการณ์ที่สม่ำเสมอโดยไม่คำนึงถึงเส้นทางที่ผู้เล่นเลือก

/th/images/simple-player-in-godot-game.jpg

การสร้างวัตถุคงที่ด้วย StaticBody2D

เพื่ออำนวยความสะดวกในการโต้ตอบระหว่างตัวเอกของเกมและสภาพแวดล้อม จำเป็นอย่างยิ่งที่จะต้องสร้างเอนทิตีแบบไดนามิกภายใน Unity3D ที่ผู้ใช้สามารถจัดการได้ วิธีหนึ่งในการบรรลุเป้าหมายนี้คือการใช้ส่วนประกอบ StaticBody2D ที่จัดเตรียมโดยชุดเครื่องมือ Mesh Renderer ของ Unity คุณลักษณะนี้ช่วยให้นักพัฒนาสามารถกำหนด Colliders และคุณสมบัติทางฟิสิกส์ให้กับองค์ประกอบต่างๆ ในฉากของพวกเขา ทำให้พวกเขาสามารถจำลองปฏิสัมพันธ์กับวัตถุเหล่านี้ได้อย่างมีประสิทธิภาพ ด้วยการใช้ประโยชน์จากพลังของ StaticBody2D นักออกแบบจึงมีอำนาจในการนำวิสัยทัศน์ที่สร้างสรรค์ของพวกเขามาสู่ชีวิตในโลกเสมือนจริงที่ชวนดื่มด่ำ

 extends StaticBody2D

func _ready():
    var collision_shape = CollisionShape2D.new()
    collision_shape.shape = RectangleShape2D.new()
    add_child(collision_shape) 

การเพิ่มอัลกอริทึมการเคลื่อนไหวแบบสุ่มสำหรับวัตถุคงที่

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

 extends StaticBody2D

var speed = 100
var value = randf_range(-1, 1)
var direction = Vector2(value,value).normalized()

func _physics_process(delta):
    position \+= direction * speed * delta 

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

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

ตำแหน่งและวิถีแบบสุ่มสำหรับวัตถุที่อยู่นิ่ง

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

 extends StaticBody2D

var speed = randf_range(50, 150)
var value = randf_range(-1, 1)
var direction = Vector2(value,value).normalized()

func _ready():
    var val1 = randf_range(0, get_viewport().size.x)
    var val2 = randf_range(0, get_viewport().size.y)
    position = Vector2(val1, val2)

func _physics_process(delta):
    position \+= direction * speed * delta 

ในการใช้งานนี้ ความเร็วของโพรเจกไทล์ถูกกำหนดให้เป็นค่าสุ่มตั้งแต่ 50 ถึง 250 พิกเซลต่อวินาทีระหว่างการเริ่มต้นภายในเมธอด \_ready() นอกจากนี้ ตำแหน่งเริ่มต้นของโพรเจกไทล์จะถูกเลือกโดยการสุ่มภายในขอบเขตของขนาดของผืนผ้าใบ ต่อจากนั้น การเคลื่อนที่ของโพรเจกไทล์จะยังคงอยู่โดยการอัปเดตตำแหน่งของมันตามการประมวลผลทางฟิสิกส์ในเมธอด \_physics\_process(delta) ซึ่งคล้ายกับการวนซ้ำก่อนหน้านี้

/th/images/random-moving-objects.jpg

การปรับความเร็ว ทิศทาง และการสุ่ม

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

 extends StaticBody2D

var speed = randf_range(50, 150)
var value = randf_range(-1, 1)
var direction = Vector2(value,value).normalized()
var speed_variation_rate = 0.5
var direction_variation_rate = 0.5

func _ready():
    var val1 = randf_range(0, get_viewport().size.x)
    var val2 = randf_range(0, get_viewport().size.y)
    position = Vector2(val1, val2)

func _physics_process(delta):
    randomize_speed_and_direction()
    position \+= direction * speed * delta

func randomize_speed_and_direction():
    if randf() < speed_variation_rate:
        speed = randf_range(50, 150)

    if randf() < direction_variation_rate:
        direction = Vector2(value, value).normalized() 

คุณลักษณะเพิ่มเติมสำหรับวัตถุเคลื่อนที่แบบสุ่มของคุณ

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

รูปแบบสี

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

 sprite.modulate = Color(randf(), randf(), randf()) 

การเปลี่ยนแปลงขนาด

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

 sprite.scale = Vector2(randf_range(0.5, 2.0), randf_range(0.5, 2.0)) 

การวางไข่ของวัตถุ

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

อายุการใช้งานของวัตถุ

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

การโต้ตอบ

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

แนวทางปฏิบัติที่ดีที่สุดสำหรับการเพิ่มวัตถุเคลื่อนที่แบบสุ่ม

เพื่อสร้างประสบการณ์ที่ดื่มด่ำและน่าหลงใหลเมื่อรวมองค์ประกอบการเคลื่อนไหวแบบสุ่มเข้าไว้ในเกม การปฏิบัติตามแนวทางที่แนะนำเป็นสิ่งสำคัญสำหรับการบรรลุผลลัพธ์ที่ดีที่สุด:

การพิจารณาประสิทธิภาพ

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

สร้างสมดุลระหว่างการสุ่มและความสามารถในการเล่น

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

การชนและการตอบสนอง

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

ความคมชัดของภาพ

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

ผลกระทบของวัตถุเคลื่อนที่แบบสุ่มในเกม Godot ของคุณ

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

นอกจากนี้ เนื่องจากเส้นทางการเคลื่อนที่ขององค์ประกอบการเคลื่อนที่เป็นสิ่งที่คาดเดาไม่ได้ จึงกลายเป็นสิ่งจำเป็นสำหรับผู้เล่นที่จะต้องรักษาสมาธิและความว่องไวในระดับที่สูงขึ้น เพื่อที่จะเคลื่อนพลผ่านภูมิทัศน์ของเกมได้อย่างมีประสิทธิภาพ