Перемещение твердого тела в направлении, в котором оно обращено в Unity и C#

#c# #unity3d #rigid-bodies

#c# #unity3d #твердые тела

Вопрос:

Я пытался заставить это работать, используя практически все методы, которые я могу найти (даже используя ужасный transform.translate), но, похоже, у меня просто не получается заставить это работать. Это всего лишь черновик кода, и если есть какие-либо другие способы сделать это, я готов кое-что изменить.

В настоящее время он едва движется (похоже, что он каким-то образом застрял на полу.) Я довольно новичок в перемещении объектов с использованием твердых тел, поэтому я в значительной степени в неведении о том, как решить эту проблему.

Вот сценарий из моей последней версии:

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

public class PlayerTest : MonoBehaviour
{
    public float speed = 10.0f;
    public Rigidbody rb;
    public Vector3 movement;

// Start is called before the first frame update
void Start()
{
    rb.GetComponent<Rigidbody>();
}

// Update is called once per frame
void Update()
{
    if (Input.GetKeyDown("w"))
    {
        movement = new Vector3(Input.GetAxis("Horizontal"), 0.0f, Input.GetAxis("Vertical"));
        }
    }
    void FixedUpdate()
    {
            moveCharacter(movement);
    }

    void moveCharacter(Vector3 direction)
    {
        rb.MovePosition(transform.position   (transform.forward * speed * Time.deltaTime));
    }
}
  

Ответ №1:

В вашем коде у вас есть функция moveCharacter внутри вашей функции обновления, в приложении есть исправленная, которая должна теперь работать. До того, как ваше FixedUpdate не вызывалось, следовательно, ваша функция moveCharacter также не выполнялась, и ваш GameObject не перемещался.

  • РЕДАКТИРОВАТЬ 1: Вы также должны умножать на свое направление движения, обновил скрипт, чтобы соответствовать этому
  • ПРАВКА 2: Я неуместно расставил фигурные скобки, теперь это исправлено
  • ПРАВКА 3: Вы также должны обновлять свой вектор перемещения3 каждый кадр, а не в том случае, если нажата кнопка W, снова исправил сценарий.
  • ПРАВКА 4: Исправлена ошибка перемещения (скопируйте и вставьте весь скрипт, поскольку я изменил больше строк)

Это обновленный скрипт:

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

public class PlayerTest : MonoBehaviour
{
    public float speed = 10.0f;
    public Rigidbody rb;
    public Vector3 movement;

    // Start is called before the first frame update
    void Start()
    {
        rb.GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        movement = new Vector3(Input.GetAxis("Horizontal"), 1f, Input.GetAxis("Vertical"));
    
    }

    void FixedUpdate()
    {
        moveCharacter(movement);
    }

    void moveCharacter(Vector3 direction)
    {
        Vector3 offset = new Vector3(movement.x * transform.position.x, movement.y * transform.position.y, movement.z * transform.position.z);
        rb.MovePosition(transform.position   (offset * speed * Time.deltaTime));
    }
}
  

Ссылки: Rigidbody.Перемещение

Комментарии:

1. Я сейчас на работе, поэтому не могу это протестировать, но умираю от желания. Спасибо за вашу помощь! Я довольно новичок в этом (очевидно, лол), если вы не могли бы подробнее рассказать о правке 3? Мне просто любопытно, если / почему лучше вызывать вектор, а не просто использовать его в операторе if.

2. Не беспокойтесь, просто скажите мне, пробовали ли вы это, сработало ли это или нет

3. Для 3-го редактирования: если вы просто обновите вектор, если нажата W, тогда вы сможете перемещаться, только если нажмете W, вектор движения не будет равен нулю, потому что он обновляется только при нажатии W, поэтому ваше движение не сработает

4. Просто вставил это туда, и это говорит мне, что операнд нельзя использовать с двумя векторными 3s (выделенная жирным шрифтом часть) rb.MovePosition(transform.position ( движение * transform.forward * скорость * Time.deltaTime));

5. Ах, я думаю, это должно быть движение transform.forward попробуйте заменить * на