Пытаюсь реализовать управление камерой как в Dino Squad или War Robots.
интересует понимание как можно выстроить систему, чтобы можно было объяснить через код,
что при наведенном прицеле на цель, при нажатии кнопки "Огонь" , камера и прицел следовали за целью, но если начинается поворот камеры при помощью пальца слежение отключись, и камера спокойно подконтрольно поворачивалась, даже при зажатой кнопки выстрела, и соответственно в обратную сторону, чтобы при зажатой кнопки огонь, если поворот камеры не осуществляется и цель находится в прицеле, то включалось бы следование поворота за целью.
грубо говорят, когда прицел на цели, и зажата кнопка выстрела, камера сама поворачивается за целью, но если начинается поворачивание пальцем , то самонаведение отключается
вот мой скрипт
void FixedUpdate()
{
Looker();
// camera controll rotation, вращением объект с помощью тачскрина
_angle.x -= Field.TouchDist.y * CamSpeed * Time.deltaTime;
_angle.y += Field.TouchDist.x * CamSpeed * Time.deltaTime;
//camera angle controll, ограничители угла поворота, чтобы не было слишком вниз и слишком вверх
_angle.x = Mathf.Clamp(_angle.x, -minClamp.x, minClamp.y);
//camera rotation вращение объекта
Quaternion rot = Quaternion.Euler(_angle.x, _angle.y, 0);
transform.rotation = Quaternion.Slerp(transform.rotation, rot, CamSpeed * Time.deltaTime);
//camera follow player это чтобы объект повторял движение Игрока (Игроком мы двигаемся)
Vector3 PlayerPos = new Vector3(Player.position.x, Player.position.y, Player.position.z);
Vector3 CameraPos = Vector3.Lerp(transform.position, PlayerPos, Time.deltaTime * CamSpeed);
transform.position = CameraPos;
}
void Looker()
{
Ray ray = camera.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0));
Debug.DrawRay(ray.origin, ray.direction * 100, Color.yellow);
RaycastHit hitt;
if (Physics.Raycast(ray, out hitt, distance, mask))
{
if (hitt.collider.gameObject.CompareTag("Enemy"))
{
GameObject Enemy = hitt.collider.gameObject;
Vector3 direction = Enemy.transform.position - transform.GetChild(0).position;
targetRotation = Quaternion.LookRotation(direction);
targetRotation = Quaternion.Euler(targetRotation.eulerAngles - transform.GetChild(0).localEulerAngles);
lookAt = Quaternion.Slerp(lookAt, targetRotation, lookspeed * Time.deltaTime);
transform.rotation = lookAt;
Но получается очень жестко, нацеливание резкое при наведении прицела соответственно резкое, а слезть с цели еще тяжелее
https://imgur.com/a/NVKVWqu - вот примерно то что есть