Related Posts Plugin for WordPress, Blogger...

1-7 Using Cursor Affordances


今天要來介紹替Cursor換圖示,當鼠標移動到敵人物件時,要顯示攻擊用的圖示;移動到一般的地形,要顯示移動的圖示。但為什麼我們要修改鼠標圖示呢?

在此引用維基百科(Wikipedia)一段針對Affordance的解釋:
環境賦使(affordance),或稱為直觀功能、預設用途可操作暗示支應性示能性等,指一件物品實際上用來做何用途,或被認為有什麼用途。也就是說在物品的某個方面,具有讓人明顯知道該如何使用它的特性。例如門提供「打開」的功能,椅子提供「支撐」的功能。


首先,匯入三種鼠標的圖檔。我不會提供這三種圖檔,所以請你自己準備喜歡的吧。

接著選取三個鼠標圖檔,將Texture Type改成Cursor。

此時,就會發現圖示有部分自動去背了。此時三個圖檔可用作鼠標使用。
Target是戰鬥鼠標,Unkown是未知領域鼠標,Walk是移動鼠標。

接著,我們將專案裡已經寫好的Cursor文件,更名為CursorAffordance。
註:如不知道Cursor文件從何而來,請參考網誌文章1-4 Using Raycasts To Query Click 
https://rpgcorecombat.blogspot.tw/2017/12/1-4-using-raycasts-to-query-click.html
CursorAffordance程式碼如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CursorAffordance : MonoBehaviour {

 [SerializeField] Texture2D walkCursor = null;
 [SerializeField] Texture2D targetCursor = null;
 [SerializeField] Texture2D unknownCursor = null;
 [SerializeField] Vector2 cursorHotspot = new Vector2 (0, 0);
 CameraRaycaster cameraRaycaster;

 void Start () {
  //取得Camera Arm中的Camera Raycaster,因為CursorAffordance.cs也是放在Camera Arm之下,故可以直接用GetComponent取得。
  cameraRaycaster = GetComponent ();
 }
 
 void Update () {
  //於Console中顯示滑鼠點擊到的Layer
  //print (cameraRaycaster.layerHit);
  switch (cameraRaycaster.layerHit) {
  case Layer.Enemy:
   Cursor.SetCursor(targetCursor, cursorHotspot, CursorMode.Auto);
   break;
  case Layer.Walkable:
   Cursor.SetCursor (walkCursor, cursorHotspot, CursorMode.Auto);
   break;
  case Layer.RaycastEndStop:
   Cursor.SetCursor(unknownCursor, cursorHotspot, CursorMode.Auto);
   break;
  default:
   Debug.LogError ("Don't know what cursor to show.");
   break;
  }
 }
}


CursorMode選擇Auto的話,就是Hardware Cursor;選擇ForceSoftware的話,就是Software Cursor。這兩者差別在哪呢?引用Unity官方的一段說明:

When setting a cursor you can specify if you want the cursor to be a hardware cursor or a software cursor. If you use a hardware cursor then rendering will be handled by the OS, otherwise Unity will render the cursor for you after everything else in the scene has been rendered.
https://blogs.unity3d.com/2012/10/22/cursor-api/

簡言之,選擇Hardware Cursor由系統控制鼠標的移動與繪製,操作速度較快不會Delay。若選擇Software Cursor則由Unity繪製,速度較慢。何時會使用到Software Cursor呢?Windows內建的鼠標有大小限制32x32,若你希望鼠標要更大,就得使用Software Cursor。

接著,將鼠標的圖檔拖曳到Cursor Affordance的變數欄位中。Cursor Hotspot是指鼠標的點擊錨點,我設置0,0的話,點擊區就會在圖檔的最左上角。如果你想設置在中間,就將你的圖檔長寬各除以2。

 製作到這邊就算完成了,但是!好大!我發現Mac的鼠標好大........我是用Hardware Cursor,所以說Mac的內建鼠標似乎沒有大小限制呢!

所以,我只好設定圖檔的大小了。我在圖檔的Inspector裡面設定Max Size為32,這樣看起來就正常多了。

留言