Показать сообщение отдельно
Старый 25.12.2013, 15:26   #6
Azamat
AnyKey`щик
 
Аватар для Azamat
 
Регистрация: 13.11.2013
Сообщений: 11
Написано одно полезное сообщение
Ответ: Поднятие пожарника по пожарной лестнице

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

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

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

Код прилагается
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;
            }
           
        }
    }
}
__________________
Предел в твоей голове.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (25.12.2013)