Выполнение какого-либо действия по нажатию мыши на объект - Unity
Суть такова: персонаж передвигается по NavMesh, управление происходит по нажатию правой кнопки мыши, мне нужно, чтобы при нажатии на определённый GameObject он сначала доходил до него, а потом при достижении позиции объекта, по которому мы кликнули, проигрывал определённую анимацию.
Ответы (2 шт):
На такие вопросы отвечали 65534 раз. Пусть этот будет 65535-ый, последний.
Если у вас UI объект прикрепите на него компонент Button. Пишите в скрипте:
using UnityEngine.UI;
...
public Button JustAButton;
...
private void Start()
{
JustAButton.onClick.AddListener
(
delegate()
{
//Тут ваши действия
}
);
}
Если у вас 3D объект используйте Raycast:
if(Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), 10)
{
//Тут ваши действия
}
Upd:
для правой кнопки тебе придется использовать Input.GetMouseButtonDown(1) и пускть луч из камеры в направлении курсора. Там уже будешь смотреть по какому коллайдеру ты попал. Тебе уже написали .
Ты можешь использовать OnMouseDown метод на объекте, по которому ты кликаешь.
Что-то типа такого:
void OnMouseDown()
{
_agent.SetDestination(transform.position);
}
void Update()
{
if(_agent.pathStatus == NavMeshPathStatus.completed || Math.Approximately(agent.remainingDistance, 0)
{
// твоя анимация
}
}
Выше это если ты используешь NavMeshAgent. Если делаешь без него, то тогда путь будешь искать до своего объекта:
NavMesh.SamplePosition(transform.position, out var navMeshHit, searchRadius, _areaMask); // найдешь ближайшую точку на навмеше к объекту, по которому ты кликнул, на котором же будет висеть этот скрипт
далее найдешь массив векторов-вейпоинтов до найденной точки от точки старта
NavMesh.CalculatePath(startPoint, navMeshHit.position, _areaMask, _path); //_path это _path = new NavMeshPath(), который ты создашь заранее
var waypoints = _path.GetCorners(); // получишь массив векторов.
Далее по мере продвижения твоего объекта к цели, будешь смотреть достиг ли ты конечного вейпоинта, которым будет waypoints[waypoints.Length - 1]. Проверить достижение вейпоинта можно сравнивая квадрат расстояния от твоего объекта до текущего вейпоинта, к которому ты едешь . типа if(Vector3.SqrMagnitude(waypoints[currentWaypoint] - agent.position) < yourSqrDistThreshold).. Ну а как доедешь уже запустишь свою анимацию. Мне было лень писать весь код по-нормальному, но думаю дошло. Вот сюда еще зайди.