Изменить значок курсора мыши в C #

Я создаю игру для ПК с Windows, и мне нужно изменить значок курсора, когда пользователь находится над интерактивными элементами пользовательского интерфейса. Я нашел эту команду Cursor.SetCursor(texture2d, vector2), но у нее есть некоторые задержки.

Когда указатель мыши находится над элементами пользовательского интерфейса, он изменяется, но имеет некоторую задержку, которая действительно раздражает (в любом случае это то, что другие пользователи говорили об этом).

После некоторого чтения я узнал, что Unity в основном просто меняет значок курсора на уровне программного обеспечения. т.е. скрывает курсор и отображает мое изображение и заставляет его следовать за положением курсора.

Мой вопрос: как я могу изменить значок на аппаратном уровне, опять же, только в сборках Windows.

Когда я искал «Изменение курсора мыши в C #», я нашел параметр windows.forms (который не работает в единстве) и код C ++, но он не был полным (только имена методов ), и я не знаю, как запустить его на C #…


person SagiZiv    schedule 16.12.2019    source источник
comment
Обратитесь к stackoverflow.com / questions / 2902327 /   -  person Gehan Fernando    schedule 16.12.2019
comment
@GehanFernando Как я уже писал в своем вопросе, Unity не распознает пространство имен Windows.Forms, поэтому я не могу его использовать   -  person SagiZiv    schedule 16.12.2019
comment
SetCursor отлично работает и даже имеет необязательный параметр для принудительной установки оборудования.   -  person Jichael    schedule 16.12.2019
comment
@Jichael Если бы это сработало, я бы не стал задавать этот вопрос. Пользователи моей игры говорят, что у нее слишком большая задержка   -  person SagiZiv    schedule 16.12.2019
comment
Тогда это может быть ваша реализация, которая может быть неправильной. И я также сказал вам, что у него есть аппаратный принудительный режим, вы пробовали?   -  person Jichael    schedule 16.12.2019
comment
@Jichael Есть ForceSoftware или Auto. Авто не работает после сборки (у меня только черный квадрат). Я вызываю SetCursor только при входе мыши и выходе из нее, что в этом может быть не так¿   -  person SagiZiv    schedule 16.12.2019
comment
Что вы используете в качестве текстуры? Это 32x32p? Установлен ли он на Курсор? Он отлично работал во всех моих проектах.   -  person Jichael    schedule 16.12.2019
comment
@Jichael да на все вопросы   -  person SagiZiv    schedule 16.12.2019


Ответы (3)


SetCursor не очень хорошо работает во всех приложениях Windows, но правильный способ сделать это.

Cursor.SetCursor(cursorTexture, hotSpot, cursorMode);

Другой способ - сделать небольшую подделку, скрывающую курсор мыши и создающую курсор GUI для вашего случая. Вы можете добавить дополнительные условия для каждого события, которое хотите настроить.

var OnMouseEnterCursor:Texture2D;
var cursorSizeX: int = 32;  // your cursor width
var cursorSizeY: int = 32;  // your cursor height
var MouseEnterCond = false;

function OnMouseEnter()
{
 MouseEnterCond = true;
 Screen.showCursor = false;
}

function OnMouseExit()
{
 MouseEnterCond = false;
 Screen.showCursor = true;
}

function OnGUI()
{
    if(MouseEnterCond )
    {
     GUI.DrawTexture (Rect(Input.mousePosition.x-cursorSizeX/2 + cursorSizeX/2, (Screen.height-Input.mousePosition.y)-cursorSizeY/2 + cursorSizeY/2, cursorSizeX, cursorSizeY),OnMouseEnterCursor);
    }
}
person joreldraw    schedule 16.12.2019
comment
Разве это не то же самое, что программный курсор? Это просто изображение, которое отображается в позиции курсора - person SagiZiv; 16.12.2019
comment
Да, изображение отображается в позиции курсора, скрывая аппаратный курсор. Это еще один способ сделать это, он чистый, простой, 100% настраиваемый и отлично работает без задержек. - person joreldraw; 16.12.2019

Если есть способ принудительно использовать аппаратные курсоры в Unity, мир его еще не нашел.

собственная документация Unity довольно хорошо объясняет это: аппаратный курсор предпочтительнее на поддерживаемых платформах через функция, которую вы сами нашли (не забудьте установить режим курсора на автоматический), но она автоматически и неконтролируемо будет использовать программное обеспечение для неподдерживаемых платформ и разрешений.

Важно отметить, что в настройках проекта / меню настроек плеера есть специальное поле (ссылка на которое упоминается лишь вкратце) под названием «Курсор по умолчанию». Это единственный поддерживаемый аппаратный курсор, например, на приложения из магазина Windows.

И не забудьте настроить текстуры так, чтобы в их конфигурациях вводилось «курсор».

Наконец, имейте в виду, что Windows поддерживает только размером 32 x 32 пикселя. Это может заставить Unity работать при выборе типа рендеринга.

person Kasper Ingdahl Andkjær    schedule 16.12.2019
comment
Моя текстура определяется как курсор и имеет размер 32X32px, и в редакторе все хорошо, но после сборки я получаю странную текстуру для курсора - person SagiZiv; 16.12.2019

Настройки курсора по умолчанию в настройках проигрывателя работали в редакторе, но не отображались в сборке. Также ограничение размера текстуры до 32x32. Я решил эту проблему, используя метод Cursor.SetCursor в сценарии для изменения курсора.

[SerializeField] Texture2D cursor;

void Start() {
       Cursor.SetCursor(cursor, Vector3.zero, CursorMode.ForceSoftware);
}
person Codemaker    schedule 01.07.2021