unity学习|2021-9-1 unity实践出真知


文章目录

  • 对比前一天没看任何教程做的东西,看了教程的我顿悟了!(涉及多个高能知识点,建议保存)
    • 关于绘制地图
      • 昨天
      • 今天
    • 关于摄像机跟随
      • 昨天
      • 今天
    • 关于2D游戏中的UI
    • 昨天
    • 今天
    • 关于动画状态机的状态设置
      • 昨天
      • 今天
  • 关于前两天所说的动画只有向右的,我们如何在按下向左走时得到向左的动画,原来不止有一种方法
    • 利用SpriteRender中的Flip X
    • 利用localScale自身缩放
    • 利用eularEngle自身旋转
  • 优化手感,适配各类机型,Update和FixedUpdate函数的区别
  • 目前个人关于unity的部分规范
  • 感谢大家!

对比前一天没看任何教程做的东西,看了教程的我顿悟了!(涉及多个高能知识点,建议保存) 昨天花费了一天的事件,各种方面的考虑太多了,各种写代码,还浪费了很多时间。
今天看了一下一些教程,我整个人都
unity学习|2021-9-1 unity实践出真知
文章图片
unity学习|2021-9-1 unity实践出真知
文章图片

我昨天一天都干了些什么呀!果断关掉unity,新建了一个项目
不过上面真的有很多值得学习的知识点以及插件!!
下面带大家看一看,学习一下!
关于绘制地图 昨天
【unity学习|2021-9-1 unity实践出真知】我是纯靠资源包中的精灵一个一个拖进地图中的,然后Ctrl+D复制,这样费时费力,还容易出现地图脱节的情况!
今天
在Hierarchy中创建2D object中的Tilemap,在右边创建画板Palette,便能在左边的Scene地图中像画画一样创建地图啦!(我建议事先想好建立几个Tilemap,因为有的作为边界是需要碰撞的,而有的作为点缀则不需要碰撞。同时设置好它们的Order In Layer)
unity学习|2021-9-1 unity实践出真知
文章图片

创建好Tilemap后,不会直接出现Tile Palette面板,所以怎么打开Palette面板呢?
unity学习|2021-9-1 unity实践出真知
文章图片

具体的知识点有点多,而且我自己用的也不是很熟练,给大家一个b站的链接看一下简单操作吧!
链接: https://www.bilibili.com/video/BV1ME411K7wF.
关于摄像机跟随 昨天
我是利用的两个摄像机,靠自己写的一个摄像机跟随的脚本,利用的Vector3中的插值函数Lerp实现的。类似于童年的游戏松鼠大作战,玩家到达距离右侧屏幕一定距离的时候,屏幕才会向右移动。
  1. 函数实现
public class CameraFollow : MonoBehaviour {private Transform transform; private Transform player; private void Awake() {transform = GetComponent(); player = GameObject.FindWithTag("player").transform; //找到player的transform }// Update is called once per frame void Update() {if (player.position.x >= transform.position.x) // 判断摄像机与玩家的位置的x大小 {transform.position = Vector3.Lerp(new Vector3(transform.position.x, transform.position.y, transform.position.z), new Vector3(player.position.x, transform.position.y, transform.position.z), 0.3f); } } }

  1. 在这里可能就有小伙伴问了,为什么没有设置向左跟随?本来我是想设置的,先找到开始的相机与玩家的距离为最大距离,超过这个距离,则摄像机向左移动,保持这个最大距离。但是我想到很多游戏不支持镜头向左移动,所以我就没加这个。
  2. 但是,问题又又又来了,不写摄像机跟随玩家向左,那么玩家一直向左走,不就走到摄像机外面,看不到了嘛?那么这时候就要轮到我们的空气墙出场了。空气墙,也就是没有图像,但是有碰撞体的东西。
    unity学习|2021-9-1 unity实践出真知
    文章图片

    但只有这面墙还是不够的,只是不让我们在边界时走出摄像机的范围。因此,我们还要在这面墙上放上空气墙跟随的脚本(注意这里跟随的对象应该是摄像机)
public class AirWallFollow : MonoBehaviour {private Transform camera; private Vector3 OriginDir; // Start is called before the first frame update void Start() {camera = GameObject.FindWithTag("followcamera").transform; OriginDir = camera.position - transform.position; }// Update is called once per frame void Update() {transform.position = Vector3.Lerp(transform.position, camera.position - OriginDir, 0.5f); } }

  1. 虽说实现了摄像机的跟随, 但还有很多不合理的地方,而且写起来又难受有麻烦,很多功能还实现不了。比如屏幕的移动并不算平滑,感觉有点抖动的感觉。
今天
cinemachine横空出世,只需要调整参数即可完美实现摄像机跟随的效果。我将介绍cinemachine的部分重要参数功能。
当然,一开始我还在想这资源要不要钱什么的!
unity学习|2021-9-1 unity实践出真知
文章图片

结果发现,这货现在是unity自带的插件,在package manager里就能下载到。ohhhhh!!!
使用方法明日介绍。
关于2D游戏中的UI 昨天 昨天创建UI,想在屏幕左侧加上一个目前有几格血的代码,结果发现这个创建的画布怎么这么大,而且大小也无法更改
unity学习|2021-9-1 unity实践出真知
文章图片

于是我做了一个很沙雕的决定:在摄像机能照到的左上角放入了我需要作为血量的几张图片,然后做了一个血量跟随摄像机的代码。
unity学习|2021-9-1 unity实践出真知
文章图片

代码与空气墙跟随的代码几乎一样,这里就不赘述了。
但是这样的问题就是会出现,这个血量图片一直在抖动的鬼畜现象!
今天 终于知道了,这个画布是不受我们看到的Scene视图中大小的影响的,无论怎么样都是会显示到我们的屏幕中的。设置这么大是unity自带的,是因为unity不想让我们在设置画布时与地图重合,这样我们可以更好的控制调整画布中每一个UI的位置和大小。所以,我又可以放心大胆的设置UI啦,加入了血量,暂停键,音量键和退出键。
关于动画状态机的状态设置 要问unity中最能装b的神器是什么,那还得是动画状态机。
昨天
一开始我只设置了几个状态,但后来发现总是会出现向左走转到向右走的过程中会莫名其妙有个idle的动作导致动作的连接不顺畅以及从走的状态转换到跳的状态转换不过去只能原地跳的情况。然后我就各种鼓捣设置,最后就变成了这样:
unity学习|2021-9-1 unity实践出真知
文章图片

[真·乱七八糟]
今天
原来我们可以通过一些设置解决这个问题,下面介绍几个关键的属性:
unity学习|2021-9-1 unity实践出真知
文章图片

  1. Has Exit Time:有无退出动画时间,也就是在这个过程中必须等待idle的动画执行完在执行run的动画。默认勾选,在这里很明显,我们肯定是取消的,因为我们希望我们一按左右键就跑起来,不能出现动画还在idle状态,玩家就向左右走了。一般都是取消勾选的,但也看情况,如hurt受伤动画则需要等受伤动画执行完再回到idle状态。
  2. Fixed duration:固定时间的转换状态,一般我都是取消。
  3. Transition Duration:转换状态所需要的时间,问题就在这里了,一直困扰我的原因就是由于各种状态之间转换需要时间,才会出现向左走转到向右走的过程中会有个idle的动作导致动作的连接不顺畅的情况。这个时间一定要设置为0。
关于前两天所说的动画只有向右的,我们如何在按下向左走时得到向左的动画,原来不止有一种方法 注意:后两种方法必须使用刚体中的transform,否则将出现空引用错误。
nullReferenceException: Object reference not set to an instance of an object
利用SpriteRender中的Flip X
if(hor < 0) {GetComponent>().flipX = true; } else if(hor > 0) {GetComponent>().flipX = false; }

利用localScale自身缩放
if (hor != 0) {_rigidbody2D.transform.localScale = new Vector3(hor, 1, 1); }

利用eularEngle自身旋转
if(hor < 0) {_rigidbody2D.transform.eulerAngles = new Vector3(0, 180, 0); } else if(hor > 0) {_rigidbody2D.transform.eulerAngles = new Vector3(0, 0, 0); }

优化手感,适配各类机型,Update和FixedUpdate函数的区别 Update是每帧执行一次,但由于各种机型处理器并不完全相同,帧率也就不同,特别是刚体的运动,会导致在其他机型上的运行并不流畅。而FixedUpdate是固定的时间执行,即每0.02秒执行一次,一秒要执行50次,在所有机型上都是一样的执行速度。因此建议将刚体的运动都写在FixedUpdate函数中。
目前个人关于unity的部分规范
1. 定义物体上的私有组件名称均使用下划线加组件名。 2.对物体上的物理作用进行操作,要写在FixedUpdate函数中。 3.尽量将代码块分开,面向对象,易于维护。 4.动画状态机中根据需求取消has exit time和fixed duration、Transition Duration。 5.尽量使用虚拟轴和虚拟按键。 6.跳跃可以尝试改变重力的倍数来达到更真实的感觉。gravityscale 7.跳跃的盒子碰撞检测必不可少,利用关键帧的方法是不对的,因为会出现动作无法执行完的情况。 8.调试方法:可以使用debug.log的日志调试或者DrawOnGizmos画图调试.

感谢大家! 最后,感谢一下大家的支持!!!虽然不是那么厉害,但看到这个,确实也让我挺受鼓励的!希望这些文章给我帮助的同时也能给正在学习unity的朋友一些帮助,少走一些弯路。
unity学习|2021-9-1 unity实践出真知
文章图片

    推荐阅读