Только начал изучение движка и C#. Написал простой код на перемещение персонажа по клику мыши. Вроде все перемещается нормально. Но этот код не учитывает местонахождение объектов на пути. В связи с чем два вопроса:
1. Как учитывать "клики" только по определенному объекту (ландшафту или иной плоскости движения), игнорируя клики или отказ выдать координаты при пересечении луча с другим объектом на карте?
2. Какая может быть использована методика для обучения персонажа "обходить" препятствия при утыкании в них?
Приведу части кода которые есть на данный момент.
Переменные
Синтаксис:
Используется csharp
public bool go=false; //Переменная для постоянного движения
public Vector3 pos; //Тут будет хранится точка назначения
public Transform myTransform; //Тут хранится положение игрока
public float speed = 2.0f; //Скорость перемещения
public float FallSpeed = 10.0f; //Скорость падения
public float RotateSpeed = 10.0f; //Скорость поворота
public Collider col; //С этим объектом идет проверка пересечения
public CharacterController _player; //Переменная для сферы передвижения
public float radiusNoClick = 0.01f; //Радиус проверки достижения точки движения
private Vector3 direction; //Вектор направления
private RaycastHit hit; //Информация о луче
public Vector3 pos; //Тут будет хранится точка назначения
public Transform myTransform; //Тут хранится положение игрока
public float speed = 2.0f; //Скорость перемещения
public float FallSpeed = 10.0f; //Скорость падения
public float RotateSpeed = 10.0f; //Скорость поворота
public Collider col; //С этим объектом идет проверка пересечения
public CharacterController _player; //Переменная для сферы передвижения
public float radiusNoClick = 0.01f; //Радиус проверки достижения точки движения
private Vector3 direction; //Вектор направления
private RaycastHit hit; //Информация о луче
Определяет координаты клика
Синтаксис:
Используется csharp
public void Cordinate () {
// Получаем направление луча
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// Кидаем луч бесконечной длинны и проверяем пересечение слоев
if (col.Raycast(ray, out hit, Mathf.Infinity)) {
pos = hit.point;
go=true;
}
}
Собсно функция перемещения
Синтаксис:
Используется csharp
if (go && pos != null) {
}
Debug.Log("Function Move");
if ((Mathf.Abs(myTransform.position.x - pos.x) >= radiusNoClick) && (Mathf.Abs(myTransform.position.z - pos.z) >= radiusNoClick))
{
// Вычисляем вектор перемещения
direction = pos - this.transform.position;
// Нормализуем, что бы персонаж смотрел не в землю, а прямо
direction = new Vector3(direction.x, 0, direction.z);
direction.Normalize();
//Debug.DrawLine (pos, myTransform.position, Color.yellow);
myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(direction), RotateSpeed*Time.deltaTime);
_player.Move(direction * Time.deltaTime * speed);
}
else {
Debug.Log ("Raven");
go=false;}
}
}
Debug.Log("Function Move");
if ((Mathf.Abs(myTransform.position.x - pos.x) >= radiusNoClick) && (Mathf.Abs(myTransform.position.z - pos.z) >= radiusNoClick))
{
// Вычисляем вектор перемещения
direction = pos - this.transform.position;
// Нормализуем, что бы персонаж смотрел не в землю, а прямо
direction = new Vector3(direction.x, 0, direction.z);
direction.Normalize();
//Debug.DrawLine (pos, myTransform.position, Color.yellow);
myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(direction), RotateSpeed*Time.deltaTime);
_player.Move(direction * Time.deltaTime * speed);
}
else {
Debug.Log ("Raven");
go=false;}
}