Component.GetComponent‹Rigidbody›() вызывает массу ошибок

Я пытаюсь следовать онлайн-учебнику по космическим шутерам с unity5, и у меня проблемы с жестким телом.

Я понимаю, что твердое тело было заменено на Component.GetComponent(), но я хочу создать переменную вместо того, чтобы вводить все это.

Я получаю ТОННУ ошибок, используя Component.GetComponent(), и не понимаю, что не так.

Вот мой фрагмент кода, я пытаюсь ограничить движение зажимом:

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour {

    public float speed;
    public float xMin, zMin, xMax, zMax;

    void FixedUpdate(){
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
        Component.GetComponent<Rigidbody>().velocity = movement*speed;

        Component.GetComponent<Rigidbody>().position = new Vector3
        (
            Mathf.Clamp(Component.GetComponent<Rigidbody>().position.x, xMin, xMax),
            0.0f,
            Mathf.Clamp(Component.GetComponent<Rigidbody>().position.z, zMin, zMax)
        );
    }
}

и вот куча ошибок, которые он мне выдает:

Finished updating scripts / assemblies

Some scripts have compilation errors which may prevent obsolete API usages to get updated. Obsolete API updating will continue automatically after these errors get fixed.

Assets/Scripts/PlayerController.cs(14,27): error CS0120: An object reference is required to access non-static member `UnityEngine.Component.GetComponent(System.Type)'

Assets/Scripts/PlayerController.cs(14,47): error CS0120: An object reference is required to access non-static member `UnityEngine.Component.GetComponent(System.Type)'

Assets/Scripts/PlayerController.cs(18,31): error CS1502: The best overloaded method match for `UnityEngine.Mathf.Clamp(float, float, float)' has some invalid arguments

Assets/Scripts/PlayerController.cs(18,31): error CS1503: Argument `#1' cannot convert `object' expression to type `float'

Assets/Scripts/PlayerController.cs(20,47): error CS0120: An object reference is required to access non-static member `UnityEngine.Component.GetComponent(System.Type)'

Assets/Scripts/PlayerController.cs(20,31): error CS1502: The best overloaded method match for `UnityEngine.Mathf.Clamp(float, float, float)' has some invalid arguments

Assets/Scripts/PlayerController.cs(20,31): error CS1503: Argument `#1' cannot convert `object' expression to type `float'

Assets/Scripts/PlayerController.cs(21,18): error CS1502: The best overloaded method match for `UnityEngine.Vector3.Vector3(float, float, float)' has some invalid arguments

Assets/Scripts/PlayerController.cs(21,18): error CS1503: Argument `#1' cannot convert `object' expression to type `float'

Assets/Scripts/PlayerController.cs(16,27): error CS0120: An object reference is required to access non-static member `UnityEngine.Component.GetComponent(System.Type)'

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


person user8363    schedule 11.07.2015    source источник


Ответы (1)


Вы должны сначала создать экземпляр объекта, прежде чем использовать нестатические функции класса.

В вашем случае, скорее всего, это будет gameObject, к которому прикреплен компонент RigidBody. Вот пример кода:

gameObject.GetComponent<RigidBody>().velocity = movement * speed;

Повторите другие строки в вашем коде соответственно.

person Nikita    schedule 11.07.2015
comment
Это работает, я также обнаружил, что this.gameObject.GetComponent и this.GetComponent работают. - person user8363; 11.07.2015
comment
Также просто GetComponent - person user8363; 11.07.2015
comment
Поскольку вы используете один и тот же RigidBody в нескольких местах, было бы неплохо, если бы вы создали переменную, содержащую этот компонент. Поэтому используйте RigidBody rb = gameObjcet.GetComponent<RigidBody>() или один из ваших примеров его получения, а затем каждый раз, когда вы хотите взаимодействовать с этим компонентом, вы используете rb вместо GetComponent<RigidBody>(). Например rb.velocity = movement * speed. - person Nikita; 11.07.2015