unity学习日记:如何在手机上实现第三人称视角

2023-10-28

在手机上实现第三人称视角与在电脑上并无太大区别,只不过需要检测屏幕触碰以及滑动等问题。大体思路就是,在每一帧的开头,将Camera放到target的位置上等待进行旋转,获取到每一帧手指滑动的位移值,再按照位移值进行相应的旋转,最后Camera向自身z轴负方向平移以设置距离。

在一开始获取手指滑动的位移值时,我采取了两位置相减的方式,即在获取到每一帧开始和结束时手指的位置,然后用结束时的位置减去开始时的位置得到一个向量,此向量即为手指的位移,然而Touch里面已经使用deltaPosition为我们提供了手指触摸位置距离上一次检测时的该变量,当我们在Update里面使用它时,就会得到每一帧手指位置的改变量,最后我发现使用Input.GetAxis("Mouse Y") 和Input.GetAxis("Mouse X") 也可以达到手指的位移值,然而使用deltaPosition是最简便的。Ok,镜头旋转思路有了,镜头距离控制该怎么实现?我们可以在屏幕获得两个触控点的时候进行距离控制,思路是这样的,先获得两个触点开始时的距离,再获得两个触点移动后的距离,用移动后的距离减去移动前的距离来得出两个触点的相对移动,通过这个数值,我们可以判断两个触点的移动是相互靠近了还是相互远离了,然后把这个数值乘以灵敏度并累加到现有的距离上来从新设置距离。这个思路不错,但是实际运行时,我们发现只要两触点间的距离大于初始距离,不管两触点怎么移动,视角距离都会不断变大的现象,因此,我们在每一帧视角距离设置完毕后再次获取一下当前两触点间的距离就可以了。

下面来看一看实现代码:

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

public class ThirdPersonView_Android : MonoBehaviour {
    public GameObject target;//目标物体
    float Xsensitivity=0.5f;//视角X轴旋转灵敏度
    float Ysensitivity=0.5f;//视角Y轴旋转灵敏度

    //将X轴旋转角度限制在-45度和80度之间,因计算机程序可以识别的角度为0~360,故将-45度设置为315度
    float Xrot_limit1 = 80;//旋转限制角度1
    float Xrot_limit2 = 315;//限制旋转角度2

    Vector3 rot;//手指位移向量
    float Xrot, Yrot;//视角两个轴的旋转值

    float distance = 2f;//Camera与target的距离
    float dis1;//两个触点移动前的距离
    float dis2;//两个触点移动后的距离
    float dis3;//两个触点间距离的改变量
    float distance_sensitivity = 0.003f;//设置Camera距离的灵敏度
    float max_distance = 10f;//Camera最大距离
    float min_distance = 2f;//Camera最小距离

	// Use this for initialization
	void Start () 
    {
        //如果Camera自身X轴的初始旋转角度大于80度并小于等于270度,则将其X轴旋转到80度位置
        if (transform.localEulerAngles.x > Xrot_limit1 && transform.localEulerAngles.x<=270)
        {
            transform.Rotate(Xrot_limit1 - transform.localEulerAngles.x, 0, 0);
        }
        //如果Camera自身X轴的初始旋转角度大于270度并小于315度,则将其X轴旋转到315度位置,即-45度位置
        else if (transform.localEulerAngles.x < Xrot_limit2 && transform.localEulerAngles.x > 270)
        {
            transform.Rotate(Xrot_limit2 - transform.localEulerAngles.x, 0, 0);
        }
    }
	
	// Update is called once per frame
	void Update () {
        //将Camera放在target的位置上等待旋转
        transform.position = target.transform.position;
        //如果屏幕仅收到一个触控点信息
        if (Input.touchCount == 1)
        {
            //如果检测到此触控点的状态时正在滑动
            if (Input.GetTouch(0).phase == TouchPhase.Moved)
            {
                //将触控点上一帧的位移赋给位移向量rot
                rot = Input.GetTouch(0).deltaPosition;
                //视角X轴将要旋转的值等于其现在X轴的旋转值加上负的触控点Y轴的位移量乘以灵敏度,因为我们需要手指上划时视角抬头,故此处是负的
                Xrot = transform.localEulerAngles.x - rot.y * Xsensitivity;
                //视角Y轴将要旋转的值等于其现在Y轴的旋转值加上触控点X轴的位移量乘以灵敏度
                Yrot = transform.localEulerAngles.y + rot.x * Ysensitivity;
                //当视角X轴将要旋转的值小于等于80度或者大于等于315度时(即为其处于-45度到80度的范围时)
                if (Xrot <= Xrot_limit1 || Xrot >= Xrot_limit2)
                {
                    //把视角将要旋转的值化为四元数
                    Quaternion aaaaa = Quaternion.Euler(Xrot, Yrot, 0);
                    //将四元式赋值给Camera的rotation,完成旋转
                    transform.rotation = aaaaa;
                }
                //当视角X轴将要旋转的值处于80度和315度之间时,保持视角现有的X轴旋转角度不变,只旋转其Y轴(此举是为了防止视角在X轴限制的极限位置时,斜向滑动手指视角Y轴不随着旋转)
                else if (Xrot > Xrot_limit1 && Xrot < Xrot_limit2)
                {
                    //在视角处于X轴极限旋转位置时,视角X轴旋转值不变,仅Y轴旋转值改变,将其转化为四元数
                    Quaternion aaaaa = Quaternion.Euler(transform.localEulerAngles.x , Yrot, 0);
                    //将四元式赋值给Camera的rotation,完成旋转
                    transform.rotation = aaaaa;
                }
            }
        }
        setDistance();//调用设置Camera与target距离的函数以设置其距离
		
	}
    void setDistance()
    {
        //如果检测到两个触点
        if (Input.touchCount == 2)
        {
            //如果第二个触点的状态是刚开始
            if (Input.GetTouch(1).phase == TouchPhase.Began)
            {
                //获取两个触点的距离并赋值给dis1,此为触点移动前的距离
                dis1 = Vector2.Distance(Input.GetTouch(0).position,Input.GetTouch(1).position);
            }
            //获取两个触点的距离并赋值给dis2,此为两个触点移动后的距离
            dis2 = Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
            //两个触点间距离改变量
            dis3 = dis2 - dis1;
            //新的视角距离等于原有距离减去两个触点间距离的改变量与灵敏度乘积的差,此处为减去是因为我们希望两触点对向移动镜头拉远,两手指背向移动镜头拉近,若为加则效果相反
            distance -= dis3 * distance_sensitivity;
            //将视角距离限制在min_distance和max_distance的范围之内
            distance = Mathf.Clamp(distance, min_distance, max_distance);
        }
        //camera平移,完成距离设置
        transform.Translate(Vector3.back*distance);
        //获取这一帧Camera设置完距离后的两触点间的距离,以实现下一帧只要两触点发生相对移动就会实时设置Camera距离
        dis1 = Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
    }
}




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity学习日记:如何在手机上实现第三人称视角 的相关文章

  • Unity3D 地形(Terrain)设置

    这篇说的是Unity地形 关于Unity3D是什么 我就不多做解释了 由于工作原因 该系列原创教程不定期更新 每月必然有更新 谢谢各位 Unity地形 新建地形 如图在菜单中新建一个地形 就会在 中看到Terrain对象 如果要修改地形参数
  • 树实现客户端红点系统

    树实现客户端红点系统 红点系统总览 demo 设计 代码设 引用 https zhuanlan zhihu com p 85978429 红点系统总览 如上图所示 规划红点系统的时候 我们将整个系统分为独立的三个部分 结构层 驱动层和表现层
  • Unity InputSystem 实现同一按键单击、双击、长按执行不同逻辑

    最近学习了一下Unity InputSystem 该系统可用于实现 管理复杂的操作逻辑 上限很高 但由于它有一定的学习成本 导致一些和我一样的小白一入门时不得要领 之前卡住我的一个需求就是通过InputSystem 实现同一按键单击 双击
  • unity3D期末作业捕鱼游戏,适合初学者学习使用,包含源程序所有文件

    虚拟现实期末作业捕鱼游戏 免积分下载 点我下载资源 有按钮 背景音乐 可以发射炮弹捕鱼 可以选择难度 可以调节音乐声音大小 有游戏加载进度条 详细情况请看如下动态图 点我下载资源
  • URP——后期处理特效

    通用渲染管道 URP 包括一个后处理效果的集成实现 如果使用URP 则不需要为后期处理效果安装额外的包 URP与Post Processing Stack v2包不兼容 URP使用体积框架进行后期处理效果 下面的图片显示了一个URP场景有没
  • unity中通过touch旋转、放大和缩小物体以及滑动方向的判断

    unity中通过touch旋转 放大和缩小物体以及滑动方向的判断这个需求在游戏开发中也是非常频繁 话不多说直接上代码 using System Collections using System Collections Generic usi
  • Unity_场景之间的跳转

    跳转场景之前 需要在 File gt Build Settings gt Add Open Scenes 或者 直接把 场景 拖拽进来 跳转场景方法1 已过时 跳转场景方法 public void OnStartGame string Sc
  • Unity中的单元测试

    我知道的单元测试有两种方法 1 从Unity的AssetStore窗口下载UnityTestTools 已下架了 2 使用TestRuner 2018 2 5以上版本有 我用的是2018 2 7 TestRuner的用法 操作窗口 Wind
  • 关于unity3的中关于创建方法的总结

    关于创建基本物体 有些情况会使用上 物体碰撞 游戏里怪物和英雄的触发事件上 创建一个简单物体 隐藏mesh可以作为简单的触法器使用 多次创建预制体Prefab 方法Instantiate original Object position V
  • Unity 导出XCode工程运行报错: ‘UnityFramework/UnityFramework.h‘ file not found

    简介 近期项目升级到2019 4 10f1版本 在用自动化打包的时候 遇到了一些问题 其中一个是 在导出XCode工程之后 运行工程的时候 编译报错 UnityFramework UnityFramework h file not foun
  • unity3d 输入法相关API

    Input inputString 获取输入的文字 正在打的中文是接受不到的 只有在文字写到文本框才能获取 Input imeCompositionMode 是否是激活输入框状态 on 是 Input compositionString 空
  • unity粒子特效附上贴图后播放动画

    转自 http jingyan baidu com article f96699bbb1a0d6894f3c1b77 html 参考 http www unitymanual com thread 2993 1 1 html dsign a
  • visual studio:是否统一换行符 提示弹窗是否显示

    工具 选项 环境 文档 加载时检查一致的行尾
  • 对Unity3D 静态批处理和动态批处理的理解

    Draw Call就是CPU调用图像编程接口 像OpenGL或者 DirectX 简单来说 Draw Call就是由CPU发起的一个命令 添加到一个命令缓冲区 当GPU完成了上一次的渲染任务之后 会从命令缓冲区的命令队列中再取出一个并执行
  • Unity3d 插件 系列——DoTweenPro介绍(图文详细+案例)

    Unity3d 插件 系列 DoTweenPro介绍 图文详细 案例 前言 一 DoTweenPro简介 二 DoTweenPro安装 三 DoTweenPro主要组件 1 DoTweenAnimation 2 DoTweenPath 3
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • Unity中UI组件

    一 Canvers 画布组件 Canvers下面是添加Button和Image组件 Rect Transform 1 Position 坐标位置 2 Width Height 高宽尺寸 3 Anchors 锚点 4 Pivot中心点 即UI
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • Unity在UI界面上显示3D模型/物体,控制模型旋转

    https blog csdn net ChinarCSDN article details 81058773
  • unity dots jobSystem 记录

    Looking for a way to get started writing safe multithreaded code Learn the principles behind our Job System and how it w

随机推荐

  • Vue3——Suspense组件

    Suspense组件 官网中有提到他是属于实验性功能
  • 面试知识点-- 操作系统执行可执行程序时,内存分配是怎样的?

    可执行程序的内存分布 GNU编译器生成的目标文件默认格式为elf executive linked file 格式 这是Linux系统所采用的可执行链接文件的通用文件格式 elf格式由若干个段 section 组成 由标准c源代码生成的目标
  • Java遍历List四种方法的效率对比

    Java遍历List四种方法的效率对比 遍历方法简介 Java遍历List的方法主要有 1 for each for bject o list 2 Iterator Iterator iter list iterator while ite
  • Linux配置、安装交叉编译环境 gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12.tar.gz

    步骤测试流程 步骤 1 将文件 gcc 4 6 2 glibc 2 13 linaro multilib 2011 12 tar gz 拷贝到 Ubuntu 主目录下 i MX6 用户光盘 i MX6 用户光盘 A linux tool g
  • 【Keras】LSTM和Bi-LSTM神经网络

    KerasLSTM和Bi LSTM神经网络 导入安装包 加载并划分数据集 数据处理 创建LSTM模型并训练 评估模型 创建Bi LSTM模型并训练 打印Bi LSTM模型 评估Bi LSTM模型 导入安装包 import tensorflo
  • FPGA资源之LUT

    文章目录 一 CLB资源简介 二 LUT查找表资源 SLICEM SLICEL 三 LUT资源 3 1 LUT资源工作原理 3 2 LUT资源内部结构 3 3 LUT功能的拓展 3 4 LUT硬件原语 一 CLB资源简介 Xilinx 7的
  • llvm 文件后缀转换

    emit llvm 生成和 llvm 相关的代码 S ll 可读文件 c 二进制文件 s 汇编代码 参考 http www aosabook org en llvm html http llvm org docs WritingAnLLVM
  • Android--通知之Notification

    前言 之前一篇博客讲了Android下使用Toast的方式提示消息 这篇博客讲解一下在Android中使用Notification提示消息给用户 Notification是一种具有全局效果的通知 程序一般通过NotificationMana
  • 【Proteus仿真】【51单片机】水箱液位检测控制装置设计

    文章目录 一 主要功能 二 硬件资源 三 软件设计 四 实验现象 联系作者 一 主要功能 1 压力液位检测 2 阈值设定 超限报警 3 压力液位显示 4 补排水自动控制 二 硬件资源 1 51单片机核心模块 2 PCF8591 AD DA模
  • 2023 ciscn国赛pwn lojin wp

    第一次参加国赛 被队友带飞了 pwn只做出来了四个 1381分 第16名 总体来说还可以 在所有题目中 也是拿到了pwn题login的一血 话说回来 来详细说一下 这个pwn题的解法 首先就是能看到这是个没附件的pwn题 说明只能通过交互去
  • python后端学习(十四)元类、ORM

    目录 元类 1 类也是对象 2 动态地创建类 3 使用type创建类 4 使用type创建带有属性的类 5 使用type创建带有方法的类 6 到底什么是元类 终于到主题了 7 metaclass 属性 8 自定义元类 ORM 1 ORM是什
  • Windows10系统下TensorFlow的安装教程

    前提条件 已经成功安装CUDA和cuDNN 以及Anconda软件 1 打开Anaconda Prompt 开始 gt Anaconda3 64 bit gt Anaconda Prompt anaconda3 2 查看conda版本 co
  • 腾讯程序员吐槽:1kw房产+1kw股票+300w现金,35岁准备退休

    前言 最近 在某互联网职场论坛 一位腾讯程序员发帖凡尔赛式的吐槽 35岁 已经准备好退休了 走之前给年轻人一个参考 到我这个年纪在大厂确实可能会碰到职业发展瓶颈 但并不意味着你们一毕业就去国企公务员是更好的选择 我不是被辞退 也不是离职就找
  • FTP可以登录但是不能使用被动模式上传文件

    原因 lsmod grep ftp 发现模块 ip nat ftp 被卸载导致被动模式无效 解决 在服务器上执行 modprobe ip conntrack ftp
  • 【Seq2Seq】使用神经网络进行序列到序列学习

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • jenkins的安装和配置(flask结合jenkins半自动化部署流程)

    jenkins在虚拟机中安装 1 1 背景介绍 Jenkins 是一款流行的开源持续集成 Continuous Integration 工具 广泛用于项目开发 具有自动化构建 测试和部署等功能 Jenkins官网 Jenkins Jenki
  • 解读工业互联网建设中的安全保障

    2017 11 27日 国务院发布关于深化 互联网 先进制造业 发展工业互联网的指导意见的政策文件 指导意见中用基本形势 总体要求 主要任务 保障支撑四个章节全面阐述了先进制造业融入互联网发展的新工业革命的历史契机 是把互联网信息技术融入到
  • Kubernetes系列之kubeadm部署多节点master集群

    版本信息 linux Centos7 kubernetes v1 14 5 docker v18 06 1 ce 节点信息 VIP 47 110 19 11 阿里云负载均衡 安装前准备 开始部署前确保所有节点网络正常 能访问公网 主要操作都
  • Qt Qt5NetWork.lib Qthttp的get、post请求都无法响应解决方法(丧心病狂)

    qt项目中 get post请求都无法响应 抓包发现也并没有发出请求 程序也编写通过 什么原因就是找不到 最终发现 在新建Qt Gui application的时候 如果后续要做post和get请求 一定要选上NetWork NetWork
  • unity学习日记:如何在手机上实现第三人称视角

    在手机上实现第三人称视角与在电脑上并无太大区别 只不过需要检测屏幕触碰以及滑动等问题 大体思路就是 在每一帧的开头 将Camera放到target的位置上等待进行旋转 获取到每一帧手指滑动的位移值 再按照位移值进行相应的旋转 最后Camer