- 最后登录
- 2018-12-19
- 注册时间
- 2012-8-20
- 阅读权限
- 90
- 积分
- 54706
- 纳金币
- 32328
- 精华
- 41
|
Unity 4.0上周已经发布了,而且有许多需要探索的新实用的功能。这些新功能之一是设置2D贴图作为光标的选项。尽管在官方文档中介绍的代码是非常简单的,而且解释了如何使用OnMouseEnter() 和 OnMouseExit()方法来实现它,但它只会在光标与屏幕空间中的三维物体碰撞时才会工作。然而如果游戏需要一个持续贯穿于全部层级(或者游戏)的默认自定义的光标该怎么办呢? 要在整个层级时间段内设置一个2D贴图作为光标,唯一需要做的就是调用静态的Cursor.SetCursor方法并且将贴图作为第一个参数传递进去。因此,按照MonoBehaviour类逻辑,如果在Start()或 Awake()方法中调用了Cusor.SetCursor()方法,这样当前光标就应该替换为指定了第一个参数传递的2D贴图的光标。虽然这是最简单的方法,但是到开始写本教程时它还无法工作。 只有几帧光标会被设置为2D贴图,之后,就会恢复为系统默认的当前光标。为了避免这种情况,简单的使用下面的脚本延迟SetCursor()方法调用,通过将其放在另一个方法中,并且在初始化时延迟它的调用:
using UnityEngine;
using System.Collections;
public class CustomCursor : MonoBehaviour
{
//The texture that's going to replace the current cursor
public Texture2D cursorTexture;
//This variable flags whether the custom cursor is active or not
public bool ccEnabled = false;
void Start()
{
//Call the 'SetCustomCursor' (see below) with a delay of 2 seconds.
Invoke("SetCustomCursor",2.0f);
}
void OnDisable()
{
//Resets the cursor to the default
Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
//Set the _ccEnabled variable to false
this.ccEnabled = false;
}
private void SetCustomCursor()
{
//Replace the 'cursorTexture' with the cursor
Cursor.SetCursor(this.cursorTexture, Vector2.zero, CursorMode.Auto);
Debug.Log("Custom cursor has been set.");
//Set the ccEnabled variable to ***e
this.ccEnabled = ***e;
}
}
上面的脚本中设置了两个公共变量:一个是2D贴图,光标使用的,以及一个布尔值,它是用来定义是不是要设置自定义光标(第7行和第10行)。这个布尔值不是这个脚本工作所必须的,但是,保留一个变量来标示当前光标是否已经改变是一个好主意。这样一来,如果必要的话,在脚本外部就可以检验当前光标的纹理。 跳转到该脚本的底部,定义了一个SetCustomCursor()方法(26行到33行)。在这段代码中,Cursor.SetCursor()方
法被调用。该方法有三个参数(第29行)。第一个参数是一个将要取代当前光标的2D纹理。第二个参数是一个二维向量
,它是目标点的偏移量 -- 调整点击注册点的位置。最后,第三个参数是通知Unity应该检测我们想要替换的光标是硬
件光标还是软件光标。 除此之外,这个方法打印出一条消息到控制台,用以确认当前光标已经被定义为2D贴图以及设置ccEnabled为真(30
行和32行)。回到该脚本的顶部,Start()方法只是延迟两秒(第15行)调用SetCustomCursor()方法。 OnDisable()方法只是通过传递null作为2D贴图到Cursor.SetCursor()方法中来重置当前光标为系统默认(18行到
24行)。 这样就行了!不要忘记在检查器中指定2D贴图:
拖放一个用来作为光标的纹理。不要忘记在纹理导入器中选择光标作为纹理类型。最后的思考 通过使用上面的脚本,光标的改变会持续在整个层级中,如果脚本仍然处于启用状态的话。要使其在整个游戏过程
中作为默认的光标纹理,只要将该脚本关联到一个空的游戏对象上并且在脚本的开始处加上一个对DontDestroyOnLoad()
的调用。 此外,如果ccEnabled的值对于游戏逻辑很重要的话,把它定义为私有的并且添加用来获取其当前值的公共属性。
为了简单起见,在上面的脚本中我并没有这么做。这仅是另外一个要解释的概念,这并不影响该脚本的逻辑。 以上的脚本已经在Windows 7系统的机器上测试过了。不管原始纹理的尺寸如何,当指定给光标时,它始终呈现的
是32×32像素的尺寸。我不知道为何会出现这种情况。此外,截止到撰写本文为止,Unity当前的光标支持只适用于
Windows和Mac系统的机器。我不知道在Mac或其它Windows版本的系统上光标会呈现什么尺寸。 如果你在Mac系统电脑上找到自定义纹理光标尺寸,或者有其他一些可能会对本文有所改善的话要说,请在下面留
言。
下载 下面是本示例的项目文件。上面所用的脚本已经关联到"主摄像机"了。一个JavaScript版本也包含其中: customcursor.zip。 【来源:互联网】
更多精彩教程,尽在web3D纳金网http://www.narkii.com/college/ |
|