Сообщение от 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;
}
}
}
}