Доступ к компоненту Unity3D Configurable Joint через GetComponentInChildren - PullRequest
1 голос
/ 11 апреля 2020

У меня есть капсула и сфера, соединенные настраиваемым соединением. Я перемещаю игрока, используя твердое тело капсулы, и сфера действует как колесо заклинателя (как одноколесный велосипед с подвеской).

Поскольку сфера является дочерним элементом капсулы, я использую GetComponentInChildren, чтобы попытаться получить доступ к Конфигурируемому Joint, Y Drive, Position Spring (значение с плавающей запятой).

Я заблудился при попытке решить эту проблему в Google.

Вот соответствующий код, все в //Comment не работает:

public class PlayerMovement : MonoBehaviour
{

    private Rigidbody rb;
    public float moveSpeed = 10f;
    public float distanceGround;
    public bool isGrounded = false;
    public bool isCrouch = false;


    void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Start()
    {
        distanceGround = GetComponent<Collider>().bounds.extents.y;
    }

    void FixedUpdate()
    {
        Movement();
    }

    private void Movement() 
    {
        float inputX = Input.GetAxis("LStickHorz");
        float InputZ = -Input.GetAxis("LStickVert");
        float multiplier = 1f;

        if (!Physics.Raycast (transform.position, -Vector3.up, distanceGround + 1.5f))
        {
            isGrounded = false;
            print("IN AIR.....");
        }
        else
        {
            isGrounded = true;
            print("....onGround");
            //Debug.DrawRay(?,?, Color.red, 1.25f);
        }

        if (Physics.Raycast (transform.position, -Vector3.up, distanceGround + .2f))
        {
            isCrouch = true;
            print("VVVVVVVVVVVVVV");
            //ConfigurableJoint cj = gameObject.GetComponentInChildren(typeof(ConfigurableJoint)) as ConfigurableJoint;
            //set y spring value
            //cj.yDrive.positionSpring = 50f;

        }
        else
        {
            isCrouch = false;
        }

        if (!isGrounded)
        {
            multiplier = .2f;
        }

        if (isCrouch)
        {
            multiplier = .2f;
        }

        Vector3 moveVector = new Vector3(inputX * multiplier, 0.0f, InputZ * multiplier);

        //if ()

        rb.AddForce(moveVector * moveSpeed);
    }
}

1 Ответ

1 голос
/ 11 апреля 2020

Давайте начнем с вашего первого комментария, функция Debug.DrawRay(). Если вы посмотрите документацию здесь , она расскажет вам все параметры функции и покажет вам пример. Для этой функции первые два параметра - это положение и направление:

Debug.DrawRay(transform.position, Vector3.up * 5, Color.red, 1.25f)

Вторая проблема - вы не можете установить поле positionSpring напрямую. Вам нужно будет сохранить ссылку на yDrive в другой переменной, изменить значение positionSpring, затем установить yDrive на переменную temp:

// Get the COnfigurableJoint component
ConfigurableJoint cj = gameObject.GetComponent<ConfigurableJoint>();

// Grab a reference to the JointDrive
JointDrive jd = cj.yDrive;

// Set the value of positionSpring here
jd.positionSpring = 50.0f;

// Apply the changes you made to the yDrive back to the ConfigurableJoint
cj.yDrive = jd;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...