Unity3D 2D Простая физика полета - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу создать простой симулятор полётной физики, аркадную игру в 2D,
Мне не нужно что-то слишком реалистичное, просто что-нибудь веселое.

К сожалению, мой код приводит кигра, в которой мой самолет больше похож на ракету в космосе, чем на аэродинамический самолет.

Я проверил вопросы по интернету, самым близким из которых я нашел это .Который парень написал об этой игре .

Игра выглядит немного как то, что я хочу сделать.

Я не смог найти ни одной практичной код, который я могу использовать, чтобы сделать свой самолет более реалистичным, поэтому я ищу помощь.

Пожалуйста, , не посылайте мне учиться аэродинамике или чему-то бесполезному, у меня естьпростое понимание, и мне нужна некоторая практическая помощь, а не теоретическая.

Основная проблема, с которой я столкнулся, заключается в том, что когда я хочу наклонить самолет вверх / вниз, самолет просто вращается с силой крутящего момента,однако, это не меняет своего направления быстро с потоком воздуха (поскольку нет «реального» потока воздуха ...)
Я пытался играть с перетаскиванием твердого тела, угловым перетаскиванием и параметрами, яЯ добавил свою собственную силу сопротивления ... Я что-то упустил, и я не знаю что.Я также смотрел на эти формулы , я не нашел решения.

Заранее спасибо,

Вот мой код:

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

public class PlaneController : MonoBehaviour {

    public float thrustFactor = 0.01f;
    public float maxThrustFactor = 1.0f;
    public float liftFactor = 0.1f;
    public float turnFactor = 0.1f;
    public float gravityFactor = 0.1f;
    public float dragFactor = 0.1f;

    public float thrust;
    public float liftForce;
    private Vector2 planeVelocity;
    private Rigidbody2D transformRigidbody;

    // Use this for initialization
    void Start () {
        thrust = 0;
        liftForce = 0;
        transformRigidbody = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void FixedUpdate () {
        planeVelocity = transformRigidbody.velocity;

        PlaneGravity();
        PlaneThrust();
        PlaneDrag();
        PlaneTurn();
        PlaneLift();
    }

    void PlaneLift()
    {
        float attackAngle = transform.eulerAngles.z;
        if ((attackAngle > 0 && attackAngle <= 45) || (attackAngle > 90 && attackAngle <= 135))
            liftForce = Mathf.Sin(attackAngle) * liftFactor * planeVelocity.sqrMagnitude;
        else if ((attackAngle > 45 && attackAngle <= 90) || (attackAngle > 135 && attackAngle <= 180))
            liftForce = Mathf.Cos(attackAngle) * liftFactor * planeVelocity.sqrMagnitude;

        transformRigidbody.AddForce(Vector2.up * Mathf.Abs(liftForce) * Time.fixedDeltaTime);
    }

    void PlaneThrust()
    {
        if (Input.GetKey("w"))
        {
            thrust += thrustFactor;
            thrust = Mathf.Min(thrust, maxThrustFactor);
        }

        if (Input.GetKey("s"))
        {
            thrust -= thrustFactor;
            thrust = Mathf.Max(0, thrust);
        }

        transformRigidbody.AddForce(transform.right * thrust * Time.fixedDeltaTime);
    }

    void PlaneGravity()
    {
        transformRigidbody.AddForce(gravityFactor * Vector2.down * Time.fixedDeltaTime);
    }

    void PlaneDrag()
    {
        transformRigidbody.AddForce(-transform.right * planeVelocity.sqrMagnitude * Time.fixedDeltaTime);
    }

    void PlaneTurn()
    {
        if (Input.GetKey("up"))
        {
            transformRigidbody.AddTorque(-turnFactor * Mathf.Abs(planeVelocity.sqrMagnitude) * Time.fixedDeltaTime);
        }

        if (Input.GetKey("down"))
        {
            transformRigidbody.AddTorque(turnFactor * Mathf.Abs(planeVelocity.sqrMagnitude) * Time.fixedDeltaTime);
        }
    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        Vector3 newPosition = transform.position;

        if (other.name == "LeftCollider")
        {
            newPosition.x += 17;
        }

        if (other.name == "RightCollider")
        {
            newPosition.x -= 17;
        }

        transform.SetPositionAndRotation(newPosition, transform.rotation);
    }

    private void OnCollisionExit2D(Collision2D collision)
    {
        if(collision.transform.name == "Ground")
        {
            transformRigidbody.freezeRotation = false;
        }
    }
}
...