欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 八卦 > unity使用input system实现相机屏幕手势丝滑拖拽

unity使用input system实现相机屏幕手势丝滑拖拽

2025/3/9 10:17:19 来源:https://blog.csdn.net/llllllllllgyt/article/details/145867736  浏览:    关键词:unity使用input system实现相机屏幕手势丝滑拖拽

input action设置

在这里插入图片描述

操作对象设置

camera

具体操作类

PlayerInputView类

using System.Collections;
using UnityEngine;
using UnityEngine.InputSystem;
using TouchPhase = UnityEngine.InputSystem.TouchPhase;public class FingerScale : MonoBehaviour
{private Vector3 _offset;[SerializeField] private Camera mainCamera;private Vector2 _firstTouchPosition;private Vector2 _firstTouchStartPosition;private Vector3 _firstTouchStartPositionToWorld;private Vector2 _secondTouchPosition;private Vector2 _secondTouchStartPosition;public void OnFirstTouch(InputAction.CallbackContext context){Debug.Log("OnFirstTouch"+context.phase);_firstTouchStartPosition = context.ReadValue<Vector2>();_firstTouchStartPositionToWorld = mainCamera.ScreenToWorldPoint(_firstTouchStartPosition);}public void OnTap(InputAction.CallbackContext context){if (context.performed){Vector3 worldPosition = new Vector3(_firstTouchStartPositionToWorld.x, _firstTouchStartPositionToWorld.y, -20f);StartCoroutine(MoveSmooth(worldPosition));}}public void OnFirstPosition(InputAction.CallbackContext context){_firstTouchPosition = context.ReadValue<Vector2>();Debug.Log("onFirstPosition"+context.phase);}public void OnFirstMove(InputAction.CallbackContext context){if (context.performed){_offset = mainCamera.ScreenToWorldPoint(_firstTouchPosition)-_firstTouchStartPositionToWorld;Debug.Log("_offset"+_offset);mainCamera.transform.position -= _offset;}}IEnumerator MoveSmooth(Vector3 targetPosition){Vector3 start = mainCamera.transform.position;Vector3 speed = Vector3.zero;while (Vector3.Distance(start, targetPosition) > 0.001f){mainCamera.transform.position = Vector3.SmoothDamp(start, targetPosition, ref speed, 0.3f);start = mainCamera.transform.position;yield return new WaitForEndOfFrame();}mainCamera.transform.position = targetPosition;}}

出现的问题相机位置变化后通过screenToWorldPoint获取的位置和上一帧的位置,坐标系完全不一样
如何解决:改变相机位置后再通过screentoworldpoint 修改上一帧的位置,实现丝滑拖拽
新解决:根本不需要更新lastframpos ,只需每次触发更新当前位置就可以了。因为改变相机位置后再通过screentoworldpoint 修改上一帧的位置,这一计算的结果在每一帧都一样,都是初始点击的位置。想想也确实如此。因为实现丝滑的拖拽就是要让屏幕触摸的位置相对与地图来说完全不变。在第一次接触时获取这个lastframepos的值就可以了。

ps;使用了近10多个小时才解决,不过收获颇丰。不过在input action中仍存在优化空间一个是状态机优化,一个是input action接收端接受过于冗余不利于扩展

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词