ตัวควบคุม 2D เป็นเอกภาพ (พยายามดึง platformers โรงเรียนเก่ากลับมา)


11

วันนี้ฉันพยายามสร้างตัวควบคุม 2D ด้วยความสามัคคี (ใช้ phisics) ฉันค่อนข้างใหม่สำหรับเอนจิ้นฟิสิกส์และมันยากที่จะควบคุมความรู้สึกที่ฉันกำลังมองหา ฉันจะมีความสุขมากถ้าใครสามารถแนะนำวิธีแก้ปัญหาที่ฉันพบ:

นี่คือ FixedUpdate ของฉันตอนนี้:

public void FixedUpdate()
{
    Vector3 v=new Vector3(0,-10000*Time.fixedDeltaTime,0);
    _body.AddForce(v);

    v.y=0;
    if(state(MovementState.Left))
    {
        v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
    }
    else if(state(MovementState.Right))
    {
        v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
    }

    _body.velocity=v;

    Debug.Log("Velocity: "+_body.velocity);
}

ฉันพยายามที่นี่เพื่อย้ายร่างกายที่แข็งเกร็งโดยใช้แรงโน้มถ่วงและแรงเชิงเส้นสำหรับซ้ายและขวา ฉันตั้งค่าวัสดุทางฟิสิกส์ที่ทำให้ไม่มีการกระดอนและแรงเสียดทาน 0 เมื่อเคลื่อนที่และ 1 แรงเสียดทานพร้อมขาตั้ง ปัญหาหลักคือฉันมี colliders ที่มีความลาดชันและความเร็วเปลี่ยนจากการขึ้น (ช้ากว่า), ลงไปตามทางลาด (เร็วกว่า) และเดินบน collider ตรง (ปกติ) สิ่งนี้สามารถแก้ไขได้อย่างไร? อย่างที่คุณเห็นฉันกำลังใช้ความเร็วเดียวกันกับแกน x

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

ยินดีต้อนรับเคล็ดลับอื่น ๆ ที่ทำให้ชีวิตของฉันง่ายขึ้นด้วย :)

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


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

ปัญหาของการเขียนแบบกำหนดเองคือการตรวจจับการชนกันของข้อมูลสูญหาย และมันไม่ใช่เรื่องง่ายที่จะสร้างมันขึ้นมาใหม่โดยไม่ใช้ raycast (ขึ้นอยู่กับสภาพแวดล้อม ฯลฯ ... อาจเป็นของพวกเขา) คุณจัดการกับสถานการณ์นี้อย่างไร
Notbad

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

1
กำหนดฟิสิกส์คูในสถานการณ์นี้
Ray_Garner

คำตอบ:


7

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


3

คุณอาจจะมีความสุขไปกับสิ่งที่ mheona แนะนำ ForceMode.VelocityChangeแต่ถ้าคุณกำลังจะใช้ฟิสิกส์สามัคคีของแล้วคุณอาจต้องการที่จะใช้

ตัวอย่าง:

public void FixedUpdate()
{
    var v = Vector3.zero;
    if(state(MovementState.Left))
    {
        v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
    }
    else if(state(MovementState.Right))
    {
        v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
    }

    _body.AddForce(v, ForceMode.VelocityChange);

    Debug.Log("Velocity: "+_body.velocity);
}

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

ForceMode.Impulseจะคล้ายกัน แต่ได้รับผลกระทบจากมวลของ rigidbody ทำให้ยากต่อการปรับแต่ง


2

แม้ว่าคุณจะไม่ชอบที่สร้างขึ้นในองค์ประกอบตัวอักษร Controller (ที่ผมทำ) ให้ดูที่โค้ดตัวอย่างมีความเป็นเอกภาพของการเพลย์สอน 2D

รหัสใช้การเล่นเกม 2D ที่สมบูรณ์แบบด้วยแพลตฟอร์มที่เคลื่อนไหวศัตรูและกล่องที่มีการชนกันโดยใช้ตัวควบคุมตัวละคร

แต่ถ้าคุณไม่ต้องการที่จะดูฉันแนะนำให้คุณลดการใช้ฟิสิกส์และพยายามที่จะคัดลอกพฤติกรรมของมันด้วยรหัสของคุณเอง ขึ้นอยู่กับว่าคุณวางแผนเกม 2D ประเภทใดมันอาจใช้งานได้ดี ตัวอย่างเช่นแทนที่จะใช้กำลังบังคับเพื่อRigidbody.velocityย้ายตัวละครของคุณคุณสามารถยุ่งโดยตรงกับTransform.Translate()ซึ่งย้ายวัตถุTransform.positionตามแกนของมัน คุณสามารถกำหนดforwardและbackเกี่ยวข้องกับวัตถุเองหรืออาจเป็นแพลตฟอร์มหรือพื้นTransform.upดังนั้นคุณจะรู้ว่ามันเป็นทางลาดและรู้มุมของมันหรือไม่

ถ้าคุณสร้างตัวควบคุมความเร็ว (เช่นกดปุ่มนานแค่ไหน) คุณสามารถใช้มันพร้อมกับทิศทางของคุณในขณะที่แปลเพื่อป้องกันตัวละครของคุณเดินไปรอบ ๆ โดยไม่ต้องเร่งความเร็วเหมือนอย่าง Sonic the Hedgehog สำหรับ Genesis / Mega Drive

หากคุณเลือกที่จะใช้ฟิสิกส์ต่อไปฉันไม่สามารถช่วยคุณได้เลยเพราะฉันไม่ค่อยเก่ง แต่จงระวังให้ดีว่ามันเป็นพฤติกรรมปกติที่จะ 'ลาดชัน' ช้าลงเพราะร่างกายต้องการแรงมากขึ้นในการรักษา เหมือนชีวิตจริง


สิ่งแรกที่ฉันอ่านเมื่อฉันได้สามัคคีคือการสอนนั้น ปัญหาคือความรู้สึกควบคุมไม่ดีนัก นี่คือเหตุผลที่ฉันต้องการค้นหาวิธีแก้ปัญหาของตัวเอง ในทางกลับกันเมื่อคุณเริ่มใช้ Transform.Translate () มันไม่ง่ายเลยที่จะทำทางลาดและสิ่งอื่น ๆ คุณต้องทำการร่ายสกิลหลายครั้ง (2 หรือ 3 สำหรับพื้นเพิ่มขึ้นสำหรับทิศทางที่คุณเคลื่อนไหวตามขนาดฮีโร่) สำหรับโทรศัพท์มือถือ raycast ไม่ดีและน้อยถ้าคุณทำ 5..n ต่อการตรวจสอบการชนกันซ้ำ บางทีฉันอาจจะผิด แต่ฉันไม่คิดอย่างนั้น
Notbad

1

สิ่งที่คุณต้องการในการสร้างตัวละครตัวควบคุม โดยการตั้งค่าstep offsetคุณสมบัติในส่วนนี้คุณจะได้รับผู้เล่นเลื่อนขึ้นและลงได้อย่างง่ายดาย


ขออภัยที่ไม่แสดงความคิดเห็นฉันรู้ว่ามี Character Controller ในเอกภาพและฉันใช้มันหลายครั้ง แต่ฉันไม่ชอบวิธีการทำงาน มันเหมาะกว่าสำหรับเกม FPS ไม่ใช่เกมแพลตฟอร์มที่กลไกการเคลื่อนไหวเป็นหนึ่งในสิ่งที่นำเข้ามากที่สุด
Notbad

ฉันคิดว่าเมื่อคุณเล่นซอกับการตั้งค่าบน Character Controller มันใช้งานได้ดี คุณพบสิ่งที่ขาด
NoobsArePeople2

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

0

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

หากคุณใช้กำลังสัมพันธ์กับระบบพิกัด

AddRelativeForce

คุณต้องการรักษาความเร็วสูงสุดเป็น "x" และเปรียบเทียบกับสเกลาร์โปรดจำไว้ว่าความเร็วนั้นเป็นเวกเตอร์และเขียน vx และ vy ในพื้นที่ราบ vy เป็นศูนย์ แต่จำเป็นต้องมีความลาดเอียงมากกว่าศูนย์

ความเร็วจะเปลี่ยนไปตามทิศทางของร่างกายและการเปลี่ยนแปลง vx สัมพัทธ์เมื่อเทียบกับ vx โดยรวม

วิธีนี้สามารถแก้ไข V ของคุณในแบบที่คุณไม่ต้องการได้เช่นกัน:

if (Mathf.Abs (v.x)> _ maxWalkSpeed) v.x = _maxWalkSpeed;

การรักษา Vx ทั่วโลกที่เหมือนกันอาจดูแปลกตา (การเร่งความเร็วที่ไม่ต้องการ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.