C # Unity — нужна помощь в наладке простого скрипта для 2d мобильной игры

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

Это мой сценарий, который обрабатывает прыжки, прицеливание и прилипание к стенам игрока. Начиная с rn, если вы прыгаете в стену 2 раза подряд, вы пробиваетесь сквозь нее. Если вы удерживаете палец на экране и прыгаете, линия от средства рендеринга испортится. Я знаю, что есть масса вещей, которые можно сделать лучше.

public class Jump : MonoBehaviour
{
    public float power = 10f;
    public float maxDrag = 5f;
    public Rigidbody2D rb;
    public LineRenderer lr;
    public UIDocument uiDoc;
    public FixedJoint2D fj;
    Vector3 dragStartPos;
    Touch touch;

    private Label jumpLabel;

    private bool waitingToJump = false;

    private void Start()
    {
        //gets the visual elements (buttons, labels, etc) in the UI Builder
        var rootVisualElement = uiDoc.rootVisualElement;
        jumpLabel = rootVisualElement.Q<Label>("time");
    }

    private void Update()
    {
        //checks to see if AutoJump is running, if not it starts it
        if (waitingToJump == false)
        {
            StartCoroutine(AutoJump());
            waitingToJump = true;
        }

        //drag input check
        if (Input.touchCount > 0)
        {
            touch = Input.GetTouch(0);

            if (touch.phase == TouchPhase.Began)
            {
                DragStart();
            }

            if (touch.phase == TouchPhase.Moved)
            {
                Dragging();
            }

            if (touch.phase == TouchPhase.Ended)
            {
                DragRelease();
            }
        }
    }

    //called on first touch
    void DragStart()
    {
        dragStartPos = Camera.main.ScreenToWorldPoint(touch.position);
        dragStartPos.z = 0f;
        lr.positionCount = 1;
        lr.SetPosition(0, dragStartPos);
    }
    //called while dragging
    void Dragging()
    {
        Vector3 draggingPos = Camera.main.ScreenToWorldPoint(touch.position);
        draggingPos.z = 0f;
        lr.positionCount = 2;
        lr.SetPosition(1, draggingPos);
    }
    //called when released
    void DragRelease()
    {
        Vector3 dragReleasePos = Camera.main.ScreenToWorldPoint(touch.position);
        dragReleasePos.z = 0f;
        lr.positionCount = 0;
    }

    //Jump every 3 seconds
    IEnumerator AutoJump()
    {
        yield return new WaitForSeconds(0.25f);
        jumpLabel.text = "3";
        yield return new WaitForSeconds(1);
        jumpLabel.text = "2";
        yield return new WaitForSeconds(1);
        jumpLabel.text = "1";
        yield return new WaitForSeconds(1);

        Vector3 dragReleasePos = Camera.main.ScreenToWorldPoint(touch.position);
        dragReleasePos.z = 0f;
        lr.positionCount = 0;
        
        Vector3 force = dragStartPos - dragReleasePos;
        Vector3 clampedForce = Vector3.ClampMagnitude(force, maxDrag) * power;

        jumpLabel.text = "JUMP";

        //unsticks player from wall by setting the fixed joint to itself
        fj.connectedBody = rb;

        rb.AddForce(clampedForce, ForceMode2D.Impulse);
        waitingToJump = false;
        DragRelease();
    }

    //Sticks player to wall on contact
    private void OnCollisionEnter2D(Collision2D col)
    {
        if (col.gameObject.tag == "Wall")
        {
            fj.connectedBody = col.gameObject.GetComponent<Rigidbody2D>();
        }
    }
}

Большое спасибо!

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *