Unity开发《一起来捉妖》教程 | 4.抛掷封妖灵珠
洪流学堂,让你快人几步。你好,我是郑洪智。
洪流学堂公众号回复捉妖
,可以获取本教程的源码工程。
小新:“智哥,今天咱们来开发封妖灵珠?”
大智:“好啊,你觉得实现封妖灵珠需要哪些步骤?”
小新:“我觉得大概是这样的:”
- 首先要封妖灵珠能跟随手指移动
- 手指松开时能计算扔出去的速度
- 将手指在屏幕上的速度,换算成给球施加的力,将球抛出去
大智:“思路不错嘛,就按这个来尝试实现吧。”
封妖灵珠能跟随手指移动
大智:“封妖灵珠跟随手指移动的关键是将手指触摸屏幕的屏幕空间二维坐标转换成三维空间中灵珠的坐标。具体的API可以尝试Camera.ScreenToWorldPoint
。”
小新:“那灵珠在三维空间的坐标有三个轴,第三个轴如何计算呢?”
大智:“这第三个轴就需要你来告诉它了。默认情况下使用Input.mousePosition
作为参数传入API转换出来,Z轴的坐标会是和相机世界位置的z值是一样的。这是因为Input.mousePosition
的Z是0,如果你修改一下,将z改为3,那么转换出来的坐标就是距离相机z距离的世界坐标。大概就是下面这样的代码:”
var pos = Input.mousePosition;
pos.z = 3;
var worldPos = Camera.main.ScreenToWorldPoint(pos);
小新:“那我大概明白了,我去写一下完整的功能。”
public Transform Ball;void BallUpdate()
{if (Input.GetMouseButton(0)){var pos = Input.mousePosition;pos.z = BallDistance;var worldPos = Camera.main.ScreenToWorldPoint(pos);Ball.position = worldPos;}
}
大智:“没毛病,可以接着看下一个功能了。”
计算手指松开时的速度
小新:“那计算速度有没有直接的API能使用的呢?”
大智:“这个好像真没有,不过初高中就学过速度的计算公式,是什么呢?”
小新:“速度 = 位移 / 时长
嘛”
大智:“对,这个公式到哪里都不会变的,放到虚拟世界中一样是这么计算。”
小新:“哦,我有点明白了,我先试试。”
var current = Input.mousePosition;
// 计算触摸的偏移量
var delta = current - lastMousePosition;
var velocity = delta / Time.deltaTime;
// 记录当前帧光标/触摸的位置,用于下一帧的计算
lastMousePosition = current;
大智:“对,这几行代码放到Update中就能计算出来光标当前的速度。”
换算成给球施加的力
小新:“那最后就是想办法将这个速度换算成给球施加的力咯?”
大智:“对,同样因为这个速度是屏幕空间中的速度,你得想办法转换成世界空间中的力。”
小新:“那我可不可以将光标速度的X轴转换成球在水平方向的力,然后将光标速度的Y轴转换成球在竖直方向上的力?”
大智:“那这个球可就不会往前抛了啊?”
小新:“哦哦,那我可以把光标速度的Y轴转换成施加给球的力时是往斜上方的。”
大智:“那就对啦,这样就可以把球丢出去啦。但是还有个需要注意的点,就是:屏幕空间的光标速度如果直接用到球的力上,会非常大,需要通过一个系数转换一下,这个系数大概可以参考0.001。”
小新:“好嘞,我先去码代码啦”
总结
小新:“最后的代码如下:”
using UnityEngine;public class TouchManager : MonoBehaviour
{public Transform Ball;public float BallDistance = 1;public float SpeedFactor = 0.001f;private Vector3 lastMousePosition;private Rigidbody ballRigid;void Start(){ballRigid = Ball.GetComponent<Rigidbody>();}// Update is called once per framevoid Update(){BallUpdate();var current = Input.mousePosition;var delta = current - lastMousePosition;var velocity = delta / Time.deltaTime;if (Input.GetMouseButtonUp(0)){var ballVelocity = Camera.main.transform.forward * velocity.y / 1.414f + Camera.main.transform.up * velocity.y / 1.414f + Camera.main.transform.right * velocity.x;Debug.Log(ballVelocity);ballRigid.isKinematic = false;ballRigid.AddForce(ballVelocity * SpeedFactor, ForceMode.Impulse);}// 记录当前帧光标/触摸的位置,用于下一帧的计算lastMousePosition = current;}void BallUpdate(){if (Input.GetMouseButton(0)){ballRigid.isKinematic = true;var pos = Input.mousePosition;pos.z = BallDistance;var worldPos = Camera.main.ScreenToWorldPoint(pos);Ball.position = worldPos;}}
}
洪流学堂公众号回复捉妖
,可以获取本教程的源码工程。
今日思考题
大智:“动手将今天的工程部署到真机上体验一下。”
小新:“好嘞!”
大智:“收获别忘了分享出来!也别忘了分享给你学Unity的朋友,也许能够帮到他。”
推荐阅读
- Unity开发《一起来捉妖》教程 | 3.随机妖怪位置及旋转提示
- Unity开发《一起来捉妖》教程 | 2.用摄像头图像做背景
- Unity开发《一起来捉妖》教程 | 1.陀螺仪控制相机
- Unity 2019.1 中文更新日志速览版
- Unity中的Git最佳实践
- Unity2018.3新功能 | Prefab嵌套和变体
- Unity3d中的百度语音识别及语音合成
《大话Unity2019》,大智带小新学Unity2019的有趣经历,让你学Unity更简单。
专栏《大话Unity2019》6·18返场拼团活动价立减80元!
https://edu.hongliu.cc
Unity开发《一起来捉妖》教程 | 4.抛掷封妖灵珠相关推荐
- Unity开发《一起来捉妖》教程 | 3.随机妖怪位置及旋转提示
洪流学堂,让你快人几步.你好,我是郑洪智. 洪流学堂公众号回复捉妖,可以获取本教程的源码工程. 小新:"智哥,我找了个小精灵的模型,嘿嘿,不过我经常运行的时候找不到模型在哪,怎么办?&quo ...
- Unity开发《一起来捉妖》教程 | 2.用摄像头图像做背景
洪流学堂,让你快人几步.你好,我是郑洪智. 洪流学堂公众号回复捉妖,可以获取本教程的源码工程. 小新:"我们接下来是不是需要将显示融合到屏幕上,才能称得上是AR呢?" 大智:&qu ...
- Unity开发《一起来捉妖》教程 | 1.陀螺仪控制相机
洪流学堂,让你快人几步.你好,我是郑洪智. 洪流学堂公众号回复捉妖,可以获取本教程的源码工程. 大智:"小新,你小子最近是不是谈恋爱了,怎么天天往外跑?" 小新:"嘿嘿& ...
- unity课设小游戏_【Unity3D开发小游戏】《跑酷小游戏》Unity开发教程
一.前言 最近跑酷游戏比较流行,开发教程也很多,但是大部分都是不太详细,这篇文章就带着大家一步一步开发出来一个跑酷类的游戏,教程比较基础,适合大部分Unity开发的初学者. 还有就是,此专栏已经开通收 ...
- Unity VR开发VRTK中文图文教程大全-Chinar出品定期维护更新
Chinar blog :www.chinar.xin Unity VR开发插件 VRTK 教程大全 本文提供全流程,中文翻译. Chinar 的初衷是将一种简单的生活方式带给世人 使有限时间 具备无 ...
- 【游戏音效】Unity集成Wwise并进行开发的全流程教程(一)准备工作
集成教程: [游戏音效]Unity集成Wwise并进行开发的全流程教程(二)Wwise项目 [游戏音效]Unity集成Wwise并进行开发的全流程教程(三)脚本接入Unity 前言 Unity有自己的 ...
- 【游戏音效】Unity集成Wwise并进行开发的全流程教程(二)Wwise项目
集成教程: [游戏音效]Unity集成Wwise并进行开发的全流程教程(一)准备工作 [游戏音效]Unity集成Wwise并进行开发的全流程教程(三)脚本接入Unity 前言 这一篇章大致讲一下Wwi ...
- 【游戏音效】Unity集成Wwise并进行开发的全流程教程(三)脚本接入Unity
集成教程: [游戏音效]Unity集成Wwise并进行开发的全流程教程(一)准备工作 [游戏音效]Unity集成Wwise并进行开发的全流程教程(二)Wwise项目 前言 这一篇章是Unity接入Ww ...
- 【Unity3D开发小游戏】《跑酷小游戏》Unity开发教程
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 最近跑酷游戏比较流行,开发教程也很多,但是大部分都是不太详细,这篇 ...
最新文章
- 操作canal,报错:Caused by: java.io.IOException: end of stream when reading header
- linux shell 产生随机数
- 当孩子面对困难的时候,家人可能的鼓励的方式
- C++radix sort基数排序的实现算法之二(附完整源码)
- 电梯调度问题之需求分析
- What's NEW in C++/CLI Language
- 如何选择正确的容器编排以及如何进行部署
- Linux操作系统CentOS7安装
- JAVA进阶教学之(Object类中的equals方法)
- 用 Python 轻松搞定 Excel 中的 20 个常用操作
- [转贴]壮观啊!实拍中国最美公路
- 【回归预测】基于matlab鲸鱼算法优化BP神经网络回归预测(多输入单输出)【含Matlab源码 1554期】
- Linux脚本的创建
- 基于MD5计算的未来网络游戏无限信息提取技术
- 选用计算机教材的理由原因,教材选用及管理规定
- 计算机本地硬盘满了,本地磁盘C盘满了怎么清理?
- arm板配置ssh服务
- Cron expression must consist of 6 fields
- 美团VS阿里:外卖江湖的终极一战
- 鸿蒙定时重启软件,谁有自动定时关机开机的软件!求助!
热门文章
- react使用antd实现日期与时间的不可选定
- mysql操作json优点和缺点_详解Mysql中的JSON系列操作函数
- 用python绘制叠加等边三角形_python 叠加等边三角形的绘制的实现
- python的进程和线程定位_Python | 进程 线程的理解拾遗
- 数据 正则化 python_Python数据科学:正则化方法
- mysql 一列数据变为一条_SQL 一列数据整合为一条数据
- 理解python的类实例化_理解python的类实例化
- 精致的App登录页设计欣赏给你灵感
- 设计素材|C4D别高质量模型包
- LeetCode-----替换空格