這里有一個簡單的腳本來演示這個問題。這個腳本應該將游標向左移動1秒,然后再向右移動1秒。但是你會看到它只是向左移動,然后停止。你可以翻轉順序,嘗試先向右移動,但你會發現這還是不行的。我還測驗了向上/向下移動的情況,向上移動與預期一致,向下移動則不然。
public class dumbtestscript : MonoBehaviour
{
void Start()
{
Mouse.current.WarpCursorPosition(new Vector3(123, 123) )。)
StartCoroutine(MoveCursorLeftThenRightCoroutine())。
}
IEnumerator MoveCursorLeftThenRightCoroutine()。
{
float startTime = Time.time。
while (Time.time < startTime 1)
{
Mouse.current.WarpCursorPosition(Input.mousePosition
(Time.deltaTime * new Vector3(-0.1f, 0) )。
yield return null。
}
while (Time.time < startTime 2)
{
Mouse.current.WarpCursorPosition(Input.mousePosition
(Time.deltaTime * new Vector3(0.1f, 0) )。
yield return null。
}
}
}
我是不是對WarpCursorPosition的作業原理有什么誤解?
歡迎任何建議。謝謝。
編輯:經過進一步檢查,它可能與傳遞給WarpCursorPosition的矢量有關。例如,無論我們是否使用這個來向左移動:
編輯:經過進一步檢查,這可能與傳遞給WarpCursorPosition的矢量有關。
Mouse.current.WarpCursorPosition(Input.mousePosition new Vector3(-0.1f, 0) )。)
或者這樣:
Mouse.current.WarpCursorPosition(Input.mousePosition new Vector3(-1f, 0))。
它以同樣的速度向左移動。因此,似乎-0.1和-1之間的任何東西都被四舍五入為-1。相反,對于向右移動,0.1和略低于1之間的所有東西都被四舍五入為0,這將解釋為什么它在原版中沒有移動。
那么,出于某種原因,所有東西都被四舍五入到最接近的整數?Input.mousePosition和我們正在添加的Vector3都是Vector3,我認為可以處理浮點數,所以不確定為什么事情會被四舍五入為整數,如果這就是發生了什么?
uj5u.com熱心網友回復:
問題所在
因此,由于某種原因,所有的東西都被四舍五入到最接近的整數上了?最可能的是是的!
WarpCursorPosition使你的實際系統游標跳到給定的像素坐標。
雖然在Unity內部,像素空間總是以float的形式提供給許多東西,主要是為了用它進行直接計算,但實際的系統游標使用pixels(就像螢屏上實際發生的一切),它總是完整的int值!
所以,是的,它總是(不是四舍五入,而是)將你給定的輸入值下調到下一個int(全像素)。基本上,如果你簡單地使用
var x = (int) (Input.mousePosition.x - 0.1f)。
=> 你會看到x將正好是Input.mousePosition.x - 1,因為如果當前的Input.mousePosition.x是230,那么你得到(int) 229.9f,這是229
在另一個方向,你會得到例如230 0.1f所以(int) 230.1f又是簡單的230。
=> 你的步驟至少需要一個完整的像素!
解決方案因此,與其不斷地讀取當前的
Input.mousePosition(它是上述像素坐標的基礎),不如使用和更新一個沒有的區域向量:
IEnumerator MoveCursorLeftThenRightCoroutine(/span>)
{
///將當前的滑鼠位置存盤為一個Vector2。
//這使用了浮點,并且不限于全像素的跳躍。
var currentPosition = Input.mousePosition;
for(var passedTime = 0f; passedTime < 1; passedTime = Time.deltaTime)
{
//簡單地持續添加到浮動向量。
currentPosition = Vector2.left * speedInPixelsPerSecond * Time.deltaTime。
//使用該浮動向量作為輸入,在某些幀中可能會導致沒有移動的鉗制結果。
//仍然在同一像素中,但一旦向量被增加/減少,它就會追上。
Mouse.current.WarpCursorPosition(currentPosition)。
yield return nnull;
}
for(var passedTime = 0f; passedTime < 1; passedTime = Time.deltaTime)
{
currentPosition = Vector2.right * speedInPixelsPerSecond * Time.deltaTime;
Mouse.current.WarpCursorPosition(currentPosition)。
yield return null。
}
對于新的輸入系統,我寧愿使用Mouse.current.position而不是Input.mousePosition。
uj5u.com熱心網友回復:
我沒有使用WarpCursorPosition的經驗,但是當我為回答這個問題而做實驗時,我覺得它不一致&;我想建議不要使用它。
代碼
using System.Collections;
using UnityEngine;
using UnityEngine.InputSystem;
public class Q69189325 : MonoBehaviour
{
private void Start()
{
Mouse.current.WarpCursorPosition(Input.mousePosition)。
StartCoroutine(MoveLogicCrt())。
}
IEnumerator MoveLogicCrt()。
{
yield return MoveCursorToDirectionCrt(Vector3. left, 150, 5)。
yield return null。
yield return MoveCursorToDirectionCrt(Vector3. right, 350, 5)。
}
private IEnumerator MoveCursorToDirectionCrt(Vector3 direction。float speed, float movementTime)。
{
float startTime = Time.time。
while(Time.time < startTime movementTime)
{
Vector2 newMousePosition = Input.mousePosition (Time.deltaTime * direction * speed)。
Mouse.current.WarpCursorPosition(newMousePosition)。
yield return null。
}
}
}
注釋:
由于某些原因,當我把相同的速度放在左邊和右邊時,它沒有向右移動,這很奇怪。
執行概述
https://gfycat.com/eventhriftyannelida
編碼愉快!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/312443.html
標籤:
上一篇:檢查Unity中的文本變化事件
