forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Поднятие пожарника по пожарной лестнице (http://forum.boolean.name/showthread.php?t=18727)

Azamat 18.11.2013 09:08

Поднятие пожарника по пожарной лестнице
 
Всем привет.
Нужен ваш совет.
Необходимо реализовать поднятие пожарника по пожарной лестнице на спец. технике.

Пока я это вижу так, но возможно я ошибаюсь:
1.Машина подъезжает в любое место, поднимается лестница до уровня 2го этажа, затем она двигается влево, вправо.
2.Дается команда пожарнику, и он подходит к лестнице.
3.Заходит в зону тригера (прим. navmesh не взаимодействует с тригером)и направляется на первую ступень
4.Передвигается navmeshagent до последней ступени, и в это же время парралельно проигрывается анимация "взбирания"
5.Пожарник на этаже

Условия:
1.Машина имеет разное расположение, лестница также разный угол поворота.
2.Используется navmesh

Вопросы:
1.Правильно ли использовать тригер?
2.Может использовать анимацию сразу для двух объектов? (машина и пожарник), только как это будет я не представляю.

Спасибо, буду рад любым советам;)


pax 18.11.2013 09:27

Ответ: Поднятие пожарника по пожарной лестнице
 
Картинку бы показал как это выглядит...

pax 18.11.2013 23:29

Ответ: Поднятие пожарника по пожарной лестнице
 
Заметил картинку только сейчас, Честно говоря не очень понятно как должен пожарник забираться сначала на машину, а потом на лестницу. А что навмэш на лестнице есть? Как предвигать по навмешу агента прям по лестнице, которая двигается?

Azamat 19.11.2013 07:53

Ответ: Поднятие пожарника по пожарной лестнице
 
Цитата:

Сообщение от pax (Сообщение 270416)
Заметил картинку только сейчас, Честно говоря не очень понятно как должен пожарник забираться сначала на машину, а потом на лестницу. А что навмэш на лестнице есть? Как предвигать по навмешу агента прям по лестнице, которая двигается?

Возможно сразу его перенести на лестницу, чтобы было меньше телодвижений=)
Навмеша нет на лестнице, этот вопрос вызывает затруднение.
Как вариант,пробую отключить навмеш при входе в тригер, и по достижению конечной ступени включить навмеш.

pax 19.11.2013 09:22

Ответ: Поднятие пожарника по пожарной лестнице
 
Если сразу переносить, то можно скрыть текущего пожарника, отобразить модель взбирающуюся по лестнице, а когда поднимется - сделать обратное, но уже сместив агента в нужное место.

Azamat 25.12.2013 15:26

Ответ: Поднятие пожарника по пожарной лестнице
 
Цитата:

Сообщение от pax (Сообщение 270426)
Если сразу переносить, то можно скрыть текущего пожарника, отобразить модель взбирающуюся по лестнице, а когда поднимется - сделать обратное, но уже сместив агента в нужное место.

в принципе так и сделал :)
все руки не доходили отписаться

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

по достижению второй позиции :
он трансморфмируется на этаж
и необходимые свойства компонентов запускаются

Код прилагается
Код:

public class ClimbTrigger : MonoBehaviour
{
    private Fireman fireman;
    private NavMeshAgent agent;
    private Zil zil;                  //обратиться к зилу, сказав, что пожарник на лестнице
    private Passenger passenger;      //по пути в машину, не попасть в тригер лестницы

    public List<GameObject> InClimb =new List<GameObject>();

    private GameObject unit;
    private GameObject stage1;        //первая ступень, должна быть на первой лестнице
    private GameObject stage2;        //вторая ступень, должна быть на последней лестнице
    private GameObject stage3;        //третья ступень, относительно второй ступени

    private Vector3 startPosition;
    private Vector3 firstPosition;      //позиция первой ступени
    private Vector3 secondPosition;
    private Vector3 thirthPosition;

    private float startTime;
    private float duration = 10;        //чем выше значение, тем меньше скорость поднятия

    private bool to2stage = false;

    void OnTriggerEnter(Collider unitCollider)
    {
        stage1 = GameObject.Find("Stage1");
        stage2 = GameObject.Find("Stage2");
        stage3 = GameObject.Find("Stage3");

        zil = GameObject.Find("zil").GetComponent<Zil>();
        passenger = this.transform.GetComponent<Passenger>();

        firstPosition = stage1.transform.position;
        secondPosition = stage2.transform.position;
        thirthPosition = stage3.transform.position;

        if (unitCollider.CompareTag("Unit") && unitCollider.gameObject.GetComponent("Fireman") && InClimb.Count==0)
        {
            //Debug.Log("Зашел в ClimbTrigger!");
            InClimb.Add(unitCollider.gameObject);                              //добавили в список, чтобы другие не лазали
            fireman = unitCollider.gameObject.GetComponent<Fireman>();
            agent = unitCollider.gameObject.GetComponent<NavMeshAgent>();

            unit = unitCollider.gameObject;                                    //для обращения в Update
            fireman.Target = null;                                              //отключить цель передвижения
            fireman.transform.rotation = stage1.transform.rotation;            //повернуть лицом

            agent.enabled = false;                                            //отключить агент
            unitCollider.gameObject.rigidbody.isKinematic = true;

            unitCollider.gameObject.transform.position = firstPosition;        //трансформация к первой ступепни

            if (unitCollider.gameObject.transform.position == firstPosition)  //если достиг первой позиции
            {
                //Debug.Log("Выполняется..");
                startPosition = unitCollider.gameObject.transform.position;
                startTime = Time.time;
                to2stage = true;                                              //подниматься ко второй ступени
            }
        }
    }
   
    void Update()
    {
     
        if (to2stage)
        {
            //Debug.Log("Пожарник взбирается по лестнице");
            unit.transform.position = Vector3.Lerp(startPosition, secondPosition, (Time.time - startTime) / duration);
            fireman.OnClimb();                                            //анимация "взбирания"

            if (unit.transform.position == secondPosition)
            {
                unit.transform.position = thirthPosition;                //трансформируется на этаж
                InClimb.Clear();
                to2stage = false;
                agent.enabled = true;
            }
         
        }
    }
}



Часовой пояс GMT +4, время: 11:30.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot