错误示范:
一开始把移动的代码写到update里去了,发现物体老是掉(总之移动非常不流畅,体验感很差)
cs
void Update()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, LayerMask.GetMask("Interactables")))
{
if (Input.GetMouseButton(0))
{
hit.transform.position=ScreenToWorldPos(Input.mousePosition);
}
}
}
public Vector3 ScreenToWorldPos(Vector3 screenPosition)
{
Vector3 targetScreenPos = Camera.main.WorldToScreenPoint(depthReference.position);
float depth = targetScreenPos.z;
screenPosition.z = depth;
Vector3 worldPosition = Camera.main.ScreenToWorldPoint(screenPosition);
return worldPosition;
}
修改:
把移动的代码改到协程里更新就能流畅移动了
cs
void Update()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, LayerMask.GetMask("Interactables")))
{
if (Input.GetMouseButtonDown(0))
{
StartCoroutine(Move(hit.collider.transform));
}
}
}
IEnumerator Move(Transform hitobj)
{
while (true)
{
if (Input.GetMouseButton(0) )
{
Vector3 targetPosition = ScreenToWorldPos(Input.mousePosition);
hitobj.position = targetPosition;
}
yield return null;
}
}
public Vector3 ScreenToWorldPos(Vector3 screenPosition)
{
Vector3 targetScreenPos = Camera.main.WorldToScreenPoint(depthReference.position);
float depth = targetScreenPos.z;
screenPosition.z = depth;
Vector3 worldPosition = Camera.main.ScreenToWorldPoint(screenPosition);
return worldPosition;
}
问了一下gpt大概是这个原理,说白了就是鼠标输入不是逐帧更新的,它一直在更新,update执行速度跟不上,协程的执行速度跟得上(但是我还是没明白为啥协程比update快,就算update重新启动,可是执行的代码都是一样的,要么就是因为update每次都要重新进行射线检测拖慢了速度吧)

