首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得当前游标为Texture2D Unity C#

如何获得当前游标为Texture2D Unity C#
EN

Stack Overflow用户
提问于 2017-10-23 14:24:48
回答 3查看 2.6K关注 0票数 2

我有一个问题,我想要得到当前的光标,并获得它作为一个texture2D在统一。

当我说当前游标时,我指的是用户得到的当前游标。例如,如果用户将他的光标更改为cat,我希望在Unity中具有相同的cat游标。这就是为什么我不只是在网上搜索默认光标的原因。

我试着在谷歌上搜索这个,但我得到的只有,它是在2009年发布的,代码不起作用(如果你想知道的话,它说“句柄不代表图标”)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-25 09:08:23

谢谢各位,但我想明白了,我发现了,并使用SepehrM答案将光标转换为位图,只使用用这个将位图转换为texture2D,再次感谢:)

票数 1
EN

Stack Overflow用户

发布于 2017-10-23 15:37:48

我想要遵循的步骤是:

  1. 检查哪个游标在Windows中是活动的
  2. 将该图像视为“统一”中的纹理
  3. 将纹理应用于光标

我看到的问题是,这将改变从OS到OS,所以你将很难使它与所有的操作系统兼容。

我无法读取当前的活动光标,所以我的答案是不完整的。也许有人能完成缺失的事情:

代码语言:javascript
复制
//This is the part I am not sure how to complete
//String currentCursor = 

//Here is where Windows store the cursors, you need to point to the one the 
//user is using
String path = "C:\Windows\Cursors"+currentCursor;

//Here you load that image as a texture
Texture2D cursorTexture = new Texture2D(16, 16);
cursorTexture.LoadImage(File.ReadAllBytes(path));

public CursorMode cursorMode = CursorMode.Auto;
public Vector2 hotSpot = Vector2.zero;

//You apply the texture to the cursor in Unity
void Start()
{
    Cursor.SetCursor(cursorTexture, hotSpot, cursorMode);
}

也许您可以找到这里如何使用类似的方法完成第一步,但是我不知道。

票数 2
EN

Stack Overflow用户

发布于 2017-10-23 15:53:50

任何使用win32 API的解决方案都是依赖于平台的,不能在其他平台上工作。因此,您可以添加您自己的自定义游标管理器。

代码语言:javascript
复制
//container for cursor data
[System.Serializable]
public struct CustomCursor
{
    public Texture2D Texture;
    public Vector2 HotSpot;
    public CursorMode Mode;
}

//container for all cursor you used in you project
[System.Serializable]
public class CursorsHolder
{
    [SerializeField]
    private CustomCursor defaultCursor;
    [SerializeField]
    private CustomCursor cursorA;
    [SerializeField]
    private CustomCursor cursorB;
    [SerializeField]
    private CustomCursor cursorC;

    public CustomCursor DefaultCursor { get { return defaultCursor; } }
    public CustomCursor CursorA { get { return cursorA; } }
    public CustomCursor CursorB { get { return cursorB; } }
    public CustomCursor CursorC { get { return cursorC; } }

    public void InitializeDefault(CustomCursor defaultCursor)
    {
        this.defaultCursor = defaultCursor;
    }
}

public interface ICursorHandler
{
    Texture2D CurrentCursor { get; }
    void SetCursor(CustomCursor newCursor);
}

//Manager that cached last setted cursor
public class CursorHandler
{
    private CustomCursor currentCursor;

    public CustomCursor CurrentCursor { get { return currentCursor; } }

    public void SetCursor(CustomCursor newCursor)
    {
        currentCursor = newCursor;
        Cursor.SetCursor(currentCursor.Texture, currentCursor.HotSpot, currentCursor.Mode);
        Debug.LogFormat("{0}", currentCursor.Texture);
    }
}


//Main script for cursor management usage
public class MyScript : MonoBehaviour
{
    [SerializeField]
    private CursorsHolder cursorsData;

    ICursorHandler cursorHandler = new CursorHandler();

    private void Awake()
    {
        cursorsData.InitializeDefault(new CustomCursor() { Texture = PlayerSettings.defaultCursor, HotSpot = Vector2.zero, Mode = CursorMode.ForceSoftware });

        cursorHandler.SetCursor(cursorsData.DefaultCursor);     
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            cursorHandler.SetCursor(cursorsData.CursorA);
        }

        if (Input.GetKeyDown(KeyCode.B))
        {
            cursorHandler.SetCursor(cursorsData.CursorB);
        }

        if (Input.GetKeyDown(KeyCode.C))
        {
            cursorHandler.SetCursor(cursorsData.CursorC);
        }

        if (Input.GetKeyDown(KeyCode.D))
        {
            cursorHandler.SetCursor(cursorsData.DefaultCursor);
        }

    }
}

您不能忘记在播放机设置中分配默认游标。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46891775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档