当前位置: 首页 > news >正文

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接收端接受过于冗余不利于扩展

相关文章:

  • 买二赠一--蓝桥
  • 一次现网问题定位-线程池设置不当,导致流量上去后接口变慢
  • 【网络安全 | 渗透工具】小程序反编译分析源码 | 图文教程
  • GPT-4.5震撼登场,AI世界再掀波澜!(3)
  • 【MySQL】 数据类型
  • ESP32+Mixly+LED闪烁
  • getline的使用(L1-059敲笨钟)
  • 02Java基础概念
  • ISP 常见流程
  • Python----Python爬虫(多线程,多进程,协程爬虫)
  • Apifox 2月更新|调试 AI 接口时展示思考过程,团队内支持共享数据库连接
  • 【MySQL】表操作
  • SOLID Principle基础入门
  • Vue3响应式原理解析
  • 八、数据库设计与优化详解
  • 深入探索 STM32 微控制器:从基础到实践
  • Python:字符串常见操作
  • Java 并发编程之synchronized
  • 2024年中国城市统计年鉴(PDF+excel)
  • Python 高精度计算利器:decimal 模块详解
  • 给别人做网站能赚钱吗/公司网站设计
  • bc网站怎么做排名/网盘网页版
  • 做网站能做职业吗/西安百度推广开户多少钱
  • 网站 建设方案/公众号微博seo
  • 做住宿网站挣钱吗/网站系统开发
  • 烟草外网网站建设/软文客