GitHub链接:GitHub - withoutShe/PlantVSZombie: 简单的关于PVZ的设计,分享一下
先说心得:
个人认为,一个整体且清晰的框架是极其重要的,比方说我做的植物类,其子类便是各种植物,在父类中需要归纳出所有子类共有的特性抽象为一个统一的方法方便子类继承或是调用……
然后还有一点我自认为也较为重要,就是各个细微的分类吧,一个脚本的名字就体现或者说是只能实现如其名的功能,一个函数只能实现其名字所对应的功能,宁可多写些函数方法来实现一个大功能,也不可将一个函数作为一个乐色桶,什么都往里丢
部分功能的实现思路及些教训:
先说铲子吧(最近刚实现,记忆犹新)
...
思路:ui->image->button->添加事件(必须将代码挂在GameObject上然后才能拖拽到事件那边选择监听的函数(血的教训)),但是我的这个button其实挂载的是铲子后面的框框(因为铲子和框框是分开的两张图),点击框框后激活铲子的button和铲子的脚本,然后获取鼠标的世界坐标,让其在update中时刻执行,以达到铲子跟随鼠标移动的效果(选取植物也是同理),既然铲子已经在手,只需要监听鼠标的按下,同时检测碰撞体的碰撞即可实现铲除植物的功能(不过这里有个小问题,我不知道为什么两个挂了BoxCollider2D的组件必须其中一个挂RigidBody组件才能发生碰撞)
但实际的重头戏应该是使用OnTriggerStay2D而不是OnTriggerEnter2D
CheckSide是用于检测鼠标左键是否按下的
因为在铲子接触到植物的时候,碰撞已经发生,在未按下鼠标的情况下就会触发触发器,所以需要改用持续性触发检测Stay
一些移动的实现:
我总共有用到RigidBoay2D的MovePosition、transform的Translate还有Vector3.MoveTowards
第三种方法也是查GPT实现的,基本有目的地的移动全靠第三种方法
动画的制作
要说最复杂的动画也就是僵尸了
参数设置攻击的触发器,血量百分比,当百分比低于给定值,播放对应动画
但基本没使用状态机,感觉更多的是不熟练吧不会运用
卡片的制作
通过控制CardMask的ImageType-fill 中的amount 达到卡片冷却的视觉效果(控制百分比)
预制体
这也是我在这个项目中第一次运用预制体,只要一个对象使用次数>=2,基本都可以通过预制体来复用,效果出奇的好而且方便
携程的教训:
初次接触,开启携程容易,停止携程你是真费了人(萌新)一番劲啊,正确用法参考下图:
错误的停止携程:StopCoroutine(SpawnZombie()); 踩坑后才发现,你停止携程时传递的函数方法的地址跟你启动携程时的地址非常可能不相同啊,所以来个Coroutine 类型的变量接受它的返回值,并通过返回值找到原来的地址,太妙了!
随机生成僵尸的思路:
肯定是调用携程了,方便间隔时间而生成僵尸,这其中我还想到了一个比较抽象的办法,就是User暂停游戏了,携程肯定停止,那你再次进入携程你僵尸的生成不就又重新开始了吗,所以我设计了一个静态变量ZombieCount
所以,对于这一关,你即使暂停,生成僵尸的总数肯定是不变的
与此同时他就又出了个bug->我重新开始游戏(ReStart)的时候,他静态变量肯定不会自己重置啊,所以又搞了个笨拙的方法->
然后在ZombieManager启用的时候Awake中重新把ZombieCount设置为0,虽然很蠢,但是真的是tkl。
通过预制僵尸生成点,通过Unity的Random.Range 实现随机生成效果
暂停游戏的思路:
讲实话,我不知道为啥比较喜欢通过标签来来定位对象,然后还顺便学习了一下搜索集合的办法:
foreach!
讲实话了,foreach对于搜索集合真的很方便,可以是List,也可以是数组!
然后搜索到了就禁用对应的组件,实现暂停的效果