unity基础移动功能和选中功能的简单实现和思路
第二章
OK ,来到了第二章,主要介绍unity中几种简单的移动方法和常用功能里选中功能的实现🌰
以下内容仅作参考
一、Unity中的移动方式
首先是使用Transform进行移动
Transform类
1. Transform.position
Transform.position()是Vector3类型的数据类型,这意味着V3类型能进行的运算操作可以被使用
这说明我们可以通过运算进行值的修改来达到移动的效果
比如
transform.position += moveDirection * Time.deltaTime * moveSpeed;
这段代码的意义是向某个方向按照一定的速度前进
moveDirection是V3类型的变量用来表示方向
moveSpeed是一个变量代表速度前进
Time.deltaTime是从上一帧到这一帧之间的时间间隔
这段移动代码根据以上几个要素的运算叠加描述了位移这个行为
2. Transform.Translate()
transform.Translate(moveDirection*Time.deltaTime*moveSpeed);
Transform.Translate是一个具有多个重载的方法
可以通过传入V3变量或者三个float变量来描述位移行为
二者的区别主要在一个是V3类型,一个是void方法,但是Translate可以表示坐标系的不同,默认是自身坐标系,而position是世界坐标系
这里的moveDirection是一个仅用来表示方向的归一化向量,归一化可以通过.normalized来实现
通过物理引擎表现移动
使用物理引擎方法需要给物体添加刚体组件
1. Rigidbody.AddForce()
通过对物体施加力来改变物体的运动状态,要求给定里的方向,施力模式可以根据需求选择
2. Rigidbody.MovePosition()
MovePosition()移动的Kinematic类型刚体会不受其他物理因素影响的进行运动
3.Rigidbody.velocity
velocity是描述刚体速度的一个V3变量,是刚体的属性之一,可以通过修改它的值来表现移动行为
总结
如果没有特殊要求尽量使用transform移动,物理引擎的移动方法会在过程中产生大量物理计算,对性能消耗很大
二、选中功能的实现
1.射线选中
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if( Physics.Raycast(ray, out RaycastHit raycastHit, float.MaxValue, layerMask))
{
......操作部分
}
这段代码是从主摄像机发射出一条射线到鼠标点击位置
Physics.Raycast返回一个bool值,表示在给定条件下射线是否触碰到layerMask层级下的任何物体
其中Ray表示的是一个结构体,在这里主要使用的是其中的两个V3变量,分别表示射线起点和方向
第二个参数要求显式使用out关键字返回一个RaycastHit类型的变量引用,这个变量是一个结构体类型保存着被射线击中物体的信息
第三个参数是一个float类型变量,表示射线的最大距离
最后一个是一个int型变量,表示射线判断的层级,
选中功能就先介绍这一种,有机会会把RTS游戏中的框选功能分享出来😁
总结
第二章简单介绍了移动和点击选择这个基本的功能,但是没有作相关应用,下一篇文章会根据本章内容,进行一个简单小功能的开发,第三章要做什么还没想好,准备实现一下网格系统
下一篇预告
移动和小功能的应用实现
(碎碎念)
哇,这几天太折磨人了,作为一个不看球的人,世界杯的氛围我是真的感受不来,比如昨天半夜隔壁看球学狗叫…
你欢呼或者说话我都能理解,你学狗叫是咋回事,我是半夜睡觉跑秦岭了?
早上要做核酸,晚上还要在动物园边上听狗叫
我是真的会谢🙃
现在的我be like