Хобрук: Ваш путь к мастерству в программировании

Unity- Player Jump Height / Public, Private, Static, ничего

Я следил за учебным пособием по 2D-контроллеру проигрывателя в Unity (это видео «Живое обучение, 16 декабря 2013 г. — 2D-контроллеры персонажей»).

Я смог успешно реализовать все, что показано в руководстве, с некоторыми правками, чтобы это работало в Unity 5. После этого я решил поиграть с этим, чтобы лучше понять. Одна вещь, которую я пытался сделать, это изменить высоту прыжка при нажатии клавиши пробела. Вот код:

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

public class RobotControllerScript : MonoBehaviour {
    public float maxSpeed = 10f;
    bool facingRight = true;

    Animator anim;

    bool grounded = false;
    public Transform groundCheck;
    float groundRadius = 0.2f;
    public LayerMask whatIsGround;
    public float jumpForce = 700f;

    // Use this for initialization
    void Start () {
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void FixedUpdate () {

        grounded = Physics2D.OverlapCircle(groundCheck.position, groundRadius, whatIsGround);
        anim.SetBool("Ground", grounded);

        //vSpeed = vertical speed
        anim.SetFloat("vSpeed", GetComponent<Rigidbody2D>().velocity.y);

        float move = Input.GetAxis("Horizontal");

        anim.SetFloat("Speed", Mathf.Abs(move));

        GetComponent<Rigidbody2D>().velocity = new Vector2(move * maxSpeed, 
                                        GetComponent<Rigidbody2D>().velocity.y);

        if (move > 0 && !facingRight)
        {
            Flip();
        }
        else if (move < 0 && facingRight)
        {
            Flip();
        }
    }

    void Update()
    {
        if(grounded && Input.GetKeyDown(KeyCode.Space))
        {
            anim.SetBool("Ground", false);
            GetComponent<Rigidbody2D>().AddForce(new Vector2(0, jumpForce));
        }
    }

    void Flip()
    {
        facingRight = !facingRight;
        Vector3 theScale = transform.localScale;
        theScale.x *= -1;
        transform.localScale = theScale;
    }
}

Глядя на код и пояснения к учебнику, jumpForce — это переменная, которая контролирует, насколько высоко персонаж будет прыгать (приложенная сила). Итак, я поменял 700f на 5f. Я ожидал, что персонаж совершит действительно небольшой прыжок, но этого не произошло. Он прыгнул на той же высоте, что и 700f.

public float jumpForce = 700f;

Поиграв с кодом, я смог получить ожидаемый результат, удалив «public» рядом с jumpForce. Другими способами исправить это было установить его как частный или статический. Помнится, у меня была аналогичная проблема при создании виджета температуры в QT Creator. Мне пришлось сделать переменную статической, иначе она не вернется к значению по умолчанию после преобразования C в F, но я точно не помню, почему.

Может ли кто-нибудь объяснить, почему «общедоступный» не работает и почему частный/статический/ничего может? Какое лучшее/эффективное решение этой проблемы? Большое спасибо.


  • Где вы изменили 700 на 5? В инспекторе или в коде? Если в инспекторе, вы были в режиме воспроизведения или редактирования? Если в коде, вы изменили объявление переменной или внутри метода, например update или start? 19.07.2018
  • Я изменил public float jumpForce = 700f; в публичный поплавок jumpForce = 5f; в коде (скрипт C#) 19.07.2018
  • Проверьте инспектора. Публичные поля сериализуются автоматически, а это означает, что для поля установлено значение 700 в инспекторе, и оно переопределяет ваш новый 5. 19.07.2018

Ответы:


1

Когда поле является общедоступным (или сериализуемым), оно отображается в инспекторе. Когда он отображается в инспекторе, вы настраиваете его значение, и вы ожидаете, что настройки, которые вы вносите в значение в инспекторе, будут сохранены между запусками в режиме воспроизведения.

Когда вы объявляете переменную в коде, вы можете указать начальное значение, например:

public float jumpForce = 700f;

Таким образом, при первой проверке этого объекта после создания он имеет разумную ценность. Затем вы настраиваете и выбираете лучшее значение (или возвращаетесь к тому же, что угодно). Это значение, которое вы предпочли! Вы хотите, чтобы объект продолжал функционировать таким образом, пока вы закончите работу над игрой.

Таким образом, как только поле настроено в Инспекторе, оно больше не учитывает начальное значение, которое вы жестко закодировали, и обычно это то, чего все хотят. Представьте, как это раздражает, если каждый раз, когда вы вносите изменения в свой класс, все измененные поля возвращаются к исходному жестко закодированному значению...

Если поле ранее было общедоступным, а затем вы сделали его закрытым (или каким-либо образом скрытым в инспекторе), то жестко заданное начальное значение останется в силе.

Но что, если я действительно хочу, чтобы мой объект вернулся к исходной конфигурации/конфигурации по умолчанию? Для этого и был сделан метод Reset и кнопка сброса в инспекторе!

19.07.2018
  • Спасибо за такое прекрасное объяснение! 19.07.2018
  • Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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