Нужна небольшая помощь, чтобы увидеть, как я могу сделать этот алгоритм немного лучше. Итак, у меня есть некоторый код для инструмента панорамирования, который перемещает камеру, основываясь на том, что пользователь перетаскивает мышь для перемещения камеры. Тем не менее, это действительно нервный, если это не сделано в действительно короткие перетаскивания. То есть объекты в сцене кажутся вибрирующими, что, скорее всего, вызывает вибрацию камеры и холста, а не самих объектов.
Код работает путем переключения логического значения dragging
с использованием методов SystemEvent
OnPointerDown
и OnPointerUp
и присваивает MouseStart
Vector3 в мировых координатах, а также CameraStart
Vector3.
public void OnPointerDown(PointerEventData EventData)
{
if (!dragging)
{
dragging = true;
MouseStart = new Vector3(Camera.main.ScreenToWorldPoint(Input.mousePosition).x, Camera.main.ScreenToWorldPoint(Input.mousePosition).y, 0f);
CameraStart = TheCamera.transform.position;
}
}
public void OnPointerUp(PointerEventData EventData)
{
if (dragging)
{
dragging = false;
}
}
Затем в цикле обновления, когда переменная dragging
равна true, значения с плавающей запятой xChange
и yChange
определяются на основе текущего положения мыши по сравнению с исходным положением мыши, затем положение камеры регулируется в соответствии с этими , Мой мыслительный процесс заключался в том, что, поскольку он относится к фиксированному MouseStart
(потому что он изменяется только в одном кадре, где указатель мыши щелкается и перетаскивается = 0), что если бы я перетащил, а затем сказал, что удерживал мышь неподвижно, не будет никаких изменений в координатах, поскольку это будет неоднократно ставить камеру в том же положении. Полный код выглядит так:
private bool dragging;
private string CurrentTool;
private ButtonController[] DrawingTools;
public Camera TheCamera;
public Vector3 MouseStart;
public Vector3 CameraStart;
public float sensitivity;
// Use this for initialization
void Start () {
TheCamera = FindObjectOfType<Camera>();
DrawingTools = FindObjectsOfType<ButtonController>();
}
// Update is called once per frame
void Update () {
for (int i = 0; i < DrawingTools.Length; i++)
{
if (DrawingTools[i].Pressed)
{
CurrentTool = DrawingTools[i].gameObject.name;
}
}
if (dragging && CurrentTool == "PanTool Button")
{
float xChange;
float yChange;
Vector3 MousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
if (MousePosition.x > MouseStart.x)
{
xChange = -Mathf.Abs(MousePosition.x - MouseStart.x);
}
else
{
xChange = Mathf.Abs(MousePosition.x - MouseStart.x);
}
if (MousePosition.y > MouseStart.y)
{
yChange = -Mathf.Abs(MousePosition.y - MouseStart.y);
}
else
{
yChange = Mathf.Abs(MousePosition.y - MouseStart.y);
}
TheCamera.transform.position = new Vector3(CameraStart.x + xChange*sensitivity, CameraStart.y + yChange*sensitivity, CameraStart.z);
}
}
public void OnPointerDown(PointerEventData EventData)
{
if (!dragging)
{
dragging = true;
MouseStart = new Vector3(Camera.main.ScreenToWorldPoint(Input.mousePosition).x, Camera.main.ScreenToWorldPoint(Input.mousePosition).y, 0f);
CameraStart = TheCamera.transform.position;
}
}
public void OnPointerUp(PointerEventData EventData)
{
if (dragging)
{
dragging = false;
}
}
Любая помощь приветствуется, спасибо.
РЕДАКТИРОВАТЬ: просто чтобы уточнить, это 2d окружение