На камере есть элемент поворота завязанный на кнопку мыши:
Синтаксис:
Используется csharp
private float screenYdistance = 15; // отступ от края экрана
private float scrollWheel, horizontal, vertical, mouseX, mouseY;
private float rotationX, rotationY, rotationZ;
private void Update()
{
if (Input.GetMouseButton(2))
{
mouseX = Input.GetAxis("Mouse X");
mouseY = Input.GetAxis("Mouse Y");
}
}
private void LateUpdate()
{
//Управление наклоном
float playerY = Camera.main.WorldToScreenPoint(Vector3.zero).y; //Кэшируем положение точки в стек
if ((playerY <= Camera.main.pixelHeight - screenYdistance && mouseY < 0) || (playerY >= screenYdistance && mouseY > 0)) //Наклоняем камеру, если точка в кадре
rotationX -= mouseY * sensitivity;
//Управление вращением и наклоном
transform.RotateAround(ViewCenter, Vector3.up, mouseX);
transform.localEulerAngles = new Vector3(rotationX, transform.localEulerAngles.y, 0);
}
private float scrollWheel, horizontal, vertical, mouseX, mouseY;
private float rotationX, rotationY, rotationZ;
private void Update()
{
if (Input.GetMouseButton(2))
{
mouseX = Input.GetAxis("Mouse X");
mouseY = Input.GetAxis("Mouse Y");
}
}
private void LateUpdate()
{
//Управление наклоном
float playerY = Camera.main.WorldToScreenPoint(Vector3.zero).y; //Кэшируем положение точки в стек
if ((playerY <= Camera.main.pixelHeight - screenYdistance && mouseY < 0) || (playerY >= screenYdistance && mouseY > 0)) //Наклоняем камеру, если точка в кадре
rotationX -= mouseY * sensitivity;
//Управление вращением и наклоном
transform.RotateAround(ViewCenter, Vector3.up, mouseX);
transform.localEulerAngles = new Vector3(rotationX, transform.localEulerAngles.y, 0);
}
И есть кусок кода:
Синтаксис:
Используется csharp
if (Input.GetMouseButtonDown(1))
{
var data = PointerRaycast(Input.mousePosition); // пускаем луч
Debug.Log(data); // объект куда попал луч
if (data != null)
{
//Делаем что-то полезное
}
}
GameObject PointerRaycast(Vector2 position)
{
PointerEventData pointerData = new PointerEventData(EventSystem.current);
List<RaycastResult> resultsData = new List<RaycastResult>();
pointerData.position = position;
EventSystem.current.RaycastAll(pointerData, resultsData);
if (resultsData.Count > 0)
{
return resultsData[0].gameObject;
}
return null;
}
Тут пускается луч для получения объекта UI.
Проблема в том, что если есть transform.localEulerAngles = new Vector3(rotationX, transform.localEulerAngles.y, 0); (из скрипта камеры), то рэйкаст возвращает null от объектов UI канваса в WorldSpace, но при этом нормально из канваса Screen Space Overlay. Далее зажимаем кнопку мыши и поворачиваем чуть камеру, та-да! и всё работает как надо - рэйкаст возвращает нужные объекты. А если закомментировать указанную строку, то всё работает со старта до поворота/наклона камеры, но камеру не наклонить (естественно). В чём может быть подвох, почему только после поворота камеры всё работает?