Несмотря на приложение силы, движения нет

Этот код предназначен для платформы лифтового типа, где, как только игрок встает на нее, она «поднимает» игрока, добавляя к ней силу.

Дело в том, что пока создается сила, твердое тело (игрок) не движется при движении лифта. Код был написан на C # с использованием Unity 5. В коде игроку назначается общедоступный 'rb' и он содержит жесткое тело. Анимация - это простой анимационный клип, который перемещает лифт вверх. Любые идеи? Заранее спасибо за ваше время и ответы.

Лифт кинематический, а игрок - нет.

using UnityEngine;
using System.Collections;

 /*This script activates when the player steps on the elevator, as it takes them up a floor.*/

public class ElevatorMovementScript : MonoBehaviour 
{
    private bool elevatorUp = false;
    public Animation anim;
    public int elevatorDelay = 5;
    public int force = 800;
    public Rigidbody rb;

    // Use this for initialization
    void Start () 
    {
        anim = GetComponent<Animation>();
    }   
    // Update is called once per frame
    void Update () 
    {

    }
    /*Checks if the player has stepped onto the elevator. If the player has, it waits five seconds, and then pushes the player up.*/
    void OnTriggerStay(Collider other) 
    {
        if (other.gameObject.tag == "Player" && !elevatorUp) 
        {
            Invoke("AnimationPlay",elevatorDelay);
            elevatorUp = true;
        }
    }
    /*Plays the animation of the player going up. Used for the 'Invoke' method.*/
    void AnimationPlay()
    {           
        rb.AddForce(transform.up * force);
        Debug.Log (transform.up * force);
        anim.Play ("Up");
    }
}

person user3280790    schedule 15.09.2015    source источник
comment
Вы пробовали изменить значение force? Во многих случаях, если твердое тело не двигается, это связано с тем, что величина силы слишком мала.   -  person Venkat at Axiom Studios    schedule 15.09.2015
comment
Если это действительно движущаяся платформа, вам, вероятно, следует использовать кинематическое твердое тело, а не прикладывать силу. Это заставит платформу вести себя как платформа.   -  person 31eee384    schedule 15.09.2015
comment
@VenkatatAxiomStudios - я установил силу на 500, а затем на 5 000 000, это не повлияло.   -  person user3280790    schedule 15.09.2015
comment
@ 31eee384 - И у платформы, и у игрока есть компоненты типа "твердое тело", для которых isKinematic установлено значение true. Платформа все еще движется сквозь игрока.   -  person user3280790    schedule 15.09.2015
comment
Если iskinematic истинно, тогда addforce не будет иметь никакого эффекта   -  person Venkat at Axiom Studios    schedule 15.09.2015
comment
@ user3280790 Для правильного моделирования лифта, я думаю, это то, что вам нужно: платформа с жестким телом (кинематическим) и коллайдером; спусковой крючок, прикрепленный к лифту, для обнаружения игрока; проигрыватель с твердым телом (не кинематическим) и коллайдером. Может быть, ваша проблема в том, что вы ожидаете, что триггеры столкнутся с объектами?   -  person 31eee384    schedule 15.09.2015
comment
@ 31eee384 Я поставил галочку в поле isKinematic на моем объекте игрока, и теперь он реагирует. Он не поднимается с той же скоростью, что и лифт, но, по крайней мере, я могу сказать, что у меня есть кое-что, что работает. Спасибо за вашу помощь.   -  person user3280790    schedule 15.09.2015
comment
@ user3280790 Корень проблемы в том, что вы не должны использовать AddForce для этого. Вместо этого вам следует переместить лифт. Я не знаю, перемещает ли анимация Unity объекты так, как работает физика: вы можете использовать Vector3.Lerp в качестве временной (или постоянной) замены.   -  person 31eee384    schedule 15.09.2015
comment
@ 31eee384 Я изучу Vector3.Lerp и выясню, что я могу / должен делать. На первый взгляд, работать с ним будет немного логичнее. Я чувствую себя немного глупо на самом деле, думая, что у анимации есть физическое свойство, но когда я увидел, что это используется в учебнике, я подумал, что это тоже сработает. Спасибо за твою помощь.   -  person user3280790    schedule 16.09.2015


Ответы (1)


Похоже, этот скрипт находится на игровом объекте вашего лифта, и в этом случае это строка:

rb.AddForce(transform.up * force);

Постарается приложить силу к лифту, а не к игроку. Вы должны отслеживать жесткое тело игрока или каким-то образом получить его по запросу в AnimationPlay.

Вы сказали, что

игроку назначается общедоступный 'rb'

Но rb = GetComponent<Rigidbody>(); проигнорирует это и будет использовать жесткое тело, прикрепленное к игровому объекту, к которому прикреплен ElevatorMovementScript.

person 31eee384    schedule 15.09.2015
comment
Я убрал эту часть вскоре после того, как отправил вопрос, так как увидел, что компонент заменен на лифт. Сейчас это не решает проблему, но для меня это шаг в правильном направлении. Спасибо за ваш вклад. - person user3280790; 15.09.2015
comment
@ user3280790 Не могли бы вы тогда отредактировать вопрос, указав текущий код и информацию об игровом объекте? (Какие игровые объекты, какие компоненты, какие твердые тела являются кинематическими и т. Д.) - person 31eee384; 15.09.2015
comment
Выполнено. Спасибо за вашу постоянную помощь. - person user3280790; 16.09.2015