Как изменить массу объекта, когда игрок касается его?

Я делаю игру, в которой персонаж переключается между человеком и птицей. Когда он человек, он может толкнуть ствол. Когда он птица, я хочу увеличить массу ствола, чтобы его было сложнее толкать. В настоящее время у меня есть BoxCollider2D и RigidBody2D как для игрока, так и для ствола. Триггеры не установлены.

Вот сценарий, который у меня есть на бочке.

private GrimScript script;
private Rigidbody2D rb;
public float normalMass = 10f;
public float heavyMass = 100f;

// Use this for initialization
void Awake () 
{
    script = GameObject.FindGameObjectWithTag("Player").GetComponent<GrimScript>();
    rb = gameObject.GetComponent<Rigidbody2D>();     
}

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

}

void OnCollisionEnter2D(Collision2D other)
{
    if (other.gameObject.CompareTag("Player") && script.amIRaven)
    {
        rb.mass = heavyMass;
    } 
    else
    {
        rb.mass = normalMass;
    }
}

2 ответа

Проблема заключалась в моей ссылке на скрипт, прикрепленный к плееру (GrimScript). Столкновение и ссылка на массу работают просто отлично. Я сделал игровой объект игрока общедоступной переменной, а затем получил доступ к компоненту этой переменной.

public class BarrelPush : MonoBehaviour {

public GameObject thePlayer;
private GrimScript script;
private Rigidbody2D rb;
public float normalMass = 10f;
public float heavyMass = 100f;

// Use this for initialization
void Awake() {
    //script = gameObject.FindGameObjectWithTag("Player").GetComponent<GrimScript>();
    script = thePlayer.GetComponent<GrimScript>();
    rb = gameObject.GetComponent<Rigidbody2D>();

}

void OnCollisionEnter2D(Collision2D other) {

    if (other.gameObject.CompareTag("Player") && script.amIRaven)
    {
        rb.mass = heavyMass;
    } else
    {
        rb.mass = normalMass;
            }
}

}

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

Подумайте в терминах Legend of Zelda и о том, как, когда Линк входит в коробку, его анимация (в зависимости от игры) либо замедляется, либо он просто продолжает идти головой в коробку с объектом, медленно движущимся в заданном направлении.

Есть довольно много переменных, которые нужно учитывать, например, как вы планируете перемещать предмет, поднимаете ли вы его физически, просто скользите по полу и т. Д.

-EDIT 1--

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

Другие вопросы по тегам