Kestabilan bersama dan Ragdoll
Scripting

Roda Collider Tutorial

Komponen Wheel ColliderBentuk tak terlihat yang digunakan untuk menangani tabrakan fisik untuk objek. Seorang sari tidak perlu menjadi bentuk yang sama dengan jala objek - perkiraan kasar sering lebih efisien dan tidak dapat dibedakan dalam gameplay. More info
Lihat di Glossary
didukung oleh PhysX 3 Vehicles SDK.

Tutorial ini membawa Anda melalui proses membuat mobil fungsi dasar.

Untuk memulai, pilih GameObjectObjek mendasar dalam adegan Unity, yang dapat mewakili karakter, props, pemandangan, kamera, waypoints, dan banyak lagi. Fungsi GameObject didefinisikan oleh Komponen yang melekat padanya. More info
Lihat di Glossary
> 3D ObjectPermainan 3D Objek seperti kubus, terrain atau ragdoll. More info
Lihat di Glossary
> Plane. Ini adalah tanah mobil akan mengemudi. Meme it Untuk menjaganya sederhana, pastikan tanah memiliki Transformasi 0 (pada komponen Transform di Jendela Inspektur, klik cog Pengaturan dan klik Reset). Meningkatkan bidang Skala Transform untuk 100 untuk membuat Plane lebih besar.

Buat kerangka mobil dasar

  1. Pertama, tambahkan GameObject untuk bertindak sebagai akar mobil GameObject. Untuk melakukan ini, pergi ke GameObject > Create Empty. Ubah nama GameObject ke car_root.
  2. Tambahkan komponen 3D RigidbodyKomponen yang memungkinkan GameObject untuk dipengaruhi oleh gravitasi simulasi dan kekuatan lainnya. More info
    Lihat di Glossary
    Fisika ke car_root. Massa default 1kg terlalu ringan untuk pengaturan suspensi default; mengubahnya menjadi 1500kg untuk membuatnya jauh lebih berat.
  3. Selanjutnya, buat Collider tubuh mobil. GameObject > 3D Object > Cube. Membuat kubus ini anak GameObject di bawah car_root. Atur Transformasi ke 0 untuk membuatnya sempurna selaras di ruang lokal. Mobil ini berorientasi di sepanjang sumbu Z, jadi atur Z Scale ke 3.
  4. Tambahkan akar roda. Pilih car_root dan GameObject > Create Empty Child. Ubah nama menjadi wheels. Atur Transformasi di atasnya. GameObject ini tidak wajib, tetapi berguna untuk tuning dan debugging nanti.
  5. Untuk membuat roda pertama, pilih wheels GameObject, pergi ke GameObject > Create Empty Child, dan nama frontLeft. Atur Transformator, kemudian atur Transform Position X ke -1, Y ke 0, dan Z untuk 1. Untuk menambahkan Collider ke roda, pergi ke Add component > Physics > Wheel ColliderRUMAH khusus untuk kendaraan yang ditanam. Ini memiliki deteksi tabrakan bawaan, roda fisika, dan model gesekan ban berbasis slip. Ini dapat digunakan untuk benda-benda selain roda, tetapi dirancang khusus untuk kendaraan dengan roda. More info
    Lihat di Glossary
    .
  6. Duplikat GameObject. Mengubah posisi frontLeft Transform ke 1. Ubah nama menjadi X.frontRight.
  7. Pilih kedua frontLeft dan frontRight GameObjects. Menggandakan mereka. Mengubah posisi Transform Z kedua GameObjects ke -1. Ubah nama menjadi rearLeft dan rearRight masing-masing.
  8. Akhirnya, pilih GameObject car_root dan gunakan Alat Pindah untuk menaikkannya sedikit di atas tanah.

Sekarang Anda harus dapat melihat sesuatu seperti ini:

Untuk membuat mobil ini benar-benar terurai, Anda perlu menulis controller untuk itu. Sampel kode berikut bekerja sebagai pengontrol:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
    
public class SimpleCarController : MonoBehaviour {
    public List<AxleInfo> axleInfos; // the information about each individual axle
    public float maxMotorTorque; // maximum torque the motor can apply to wheel
    public float maxSteeringAngle; // maximum steer angle the wheel can have
        
    public void FixedUpdate()
    {
        float motor = maxMotorTorque * Input.GetAxis("Vertical");
        float steering = maxSteeringAngle * Input.GetAxis("Horizontal");
            
        foreach (AxleInfo axleInfo in axleInfos) {
            if (axleInfo.steering) {
                axleInfo.leftWheel.steerAngle = steering;
                axleInfo.rightWheel.steerAngle = steering;
            }
            if (axleInfo.motor) {
                axleInfo.leftWheel.motorTorque = motor;
                axleInfo.rightWheel.motorTorque = motor;
            }
        }
    }
}
    
[System.Serializable]
public class AxleInfo {
    public WheelCollider leftWheel;
    public WheelCollider rightWheel;
    public bool motor; // is this wheel attached to motor?
    public bool steering; // does this wheel apply steer angle?
}

Buat skrip C# baru (Add Component > New Script), pada car_root GameObject, salin sampel ini ke file skrip dan simpan. Anda dapat menyetel parameter skrip seperti yang ditunjukkan di bawah ini; bereksperimen dengan pengaturan dan masukkan Mode Play untuk menguji hasilnya.

Pengaturan berikut sangat efektif sebagai pengontrol mobil:

Hint: Pastikan untuk meningkatkan size AxleInfo.

Anda dapat memiliki hingga 20 roda pada kasus kendaraan tunggal, dengan masing-masing menerapkan kemudi, motor atau torsi pengereman.

Selanjutnya, pindah ke roda visual. Seperti yang dapat Anda lihat, Collider Roda tidak menerapkan posisi roda simulasi dan rotasi kembali ke Transformator Roda Collider, sehingga menambahkan roda visual memerlukan beberapa trik.

Anda memerlukan beberapa geometri roda di sini. Anda dapat membuat bentuk roda sederhana dari silinder. Ada beberapa pendekatan untuk menambahkan roda visual: sehingga Anda harus menetapkan roda visual secara manual dalam sifat skrip, atau menulis beberapa logika untuk menemukan roda visual yang sesuai secara otomatis. Tutorial ini mengikuti pendekatan kedua. Pasang roda visual ke Roda Collider GameObjects.

Selanjutnya, ubah skrip pengontrol:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

[System.Serializable]
public class AxleInfo {
    public WheelCollider leftWheel;
    public WheelCollider rightWheel;
    public bool motor;
    public bool steering;
}
     
public class SimpleCarController : MonoBehaviour {
    public List<AxleInfo> axleInfos; 
    public float maxMotorTorque;
    public float maxSteeringAngle;
     
    // finds the corresponding visual wheel
    // correctly applies the transform
    public void ApplyLocalPositionToVisuals(WheelCollider collider)
    {
        if (collider.transform.childCount == 0) {
            return;
        }
     
        Transform visualWheel = collider.transform.GetChild(0);
     
        Vector3 position;
        Quaternion rotation;
        collider.GetWorldPose(out position, out rotation);
     
        visualWheel.transform.position = position;
        visualWheel.transform.rotation = rotation;
    }
     
    public void FixedUpdate()
    {
        float motor = maxMotorTorque * Input.GetAxis("Vertical");
        float steering = maxSteeringAngle * Input.GetAxis("Horizontal");
     
        foreach (AxleInfo axleInfo in axleInfos) {
            if (axleInfo.steering) {
                axleInfo.leftWheel.steerAngle = steering;
                axleInfo.rightWheel.steerAngle = steering;
            }
            if (axleInfo.motor) {
                axleInfo.leftWheel.motorTorque = motor;
                axleInfo.rightWheel.motorTorque = motor;
            }
            ApplyLocalPositionToVisuals(axleInfo.leftWheel);
            ApplyLocalPositionToVisuals(axleInfo.rightWheel);
        }
    }
}

Satu parameter penting dari komponen Collider Roda adalah Force App Point Distance. Ini adalah jarak dari dasar roda beristirahat ke titik di mana pasukan roda diterapkan. Nilai default adalah 0, yang berarti untuk menerapkan kekuatan di dasar roda istirahat, tetapi sebenarnya, itu bijaksana untuk memiliki titik ini terletak di suatu tempat sedikit di bawah pusat mobil massa.


  • 2017–11–24 Login
Kestabilan bersama dan Ragdoll
Scripting