89. 2023-12-03周总结
- 场景动效实现方案
- 线上一些报错
- 业务开发
1. 场景动效实现方案
有个动效需求,点击一个可交互物体(比如一块石头),交互物体碎裂并炸出一系列小物体,然后点击小物体,小物体一起飞到UI界面的背包按钮上。
这里有几个方面要实现:
交互物体炸裂出小物体
这一块美术那边提供的方案是使用支持碰撞的粒子做的,并且为了适应多个可交互物体,粒子是一个空粒子,程序动态的给他设置产生的网格和材质。小物体如何触发点击
因为是粒子做的,所以没法给单个小物体挂collider进行交互,因为最终的小物体都会掉落在地面,并且所有小物体都可以通过GetParticles拿到每个小物体的坐标,所以用了一个折中的方案,地面上面增加点击触发器,通过点击到的地面位置进而判断是否点击到了小物体小物体如何一起飞到UI界面背包按钮上
美术提供一个shader,将所有散落的小物件粒子聚合飞往一个3D世界的目标点,有了这个之后,技术就是需要动态(因为适配原因,UI位置会变)的将这个目标点生成出来即可。
UI控件转3D世界坐标代码
1 | var screenPos = RectTransformUtility.WorldToScreenPoint(uiCamera, image.transform.position); |
2. 线上一些报错
GeneratorId报错
有个地方用自增的方式来生成唯一id,并用一个hashset存储已经用过的id,防止重复生成。但线上发现会报错:1
2
3Index was outside the bounds of the array., stack trace: at System.Collections.Generic.HashSet`1.AddIfNotPresent(T value, Int32& location)
at Babu.Core.CommonIdGenerator.GenerateId()
at Babu.Core.ThreadSafeIdGenerator.GenerateId()查了下这时候报错可能的原因是多线程原因,但是生成之前我已经通过lock (obj) 进行加锁了,暂时还找不到问题。
Mongo报错
1
2
3
4
5
6MongoDB.Driver.MongoWaitQueueFullException: The wait queue for acquiring a connection to server 127.0.0.1:27017 is full.
at MongoDB.Driver.Core.ConnectionPools.ExclusiveConnectionPool.AcquireConnectionHelper.AcquireWaitQueueSlot()
at MongoDB.Driver.Core.ConnectionPools.ExclusiveConnectionPool.AcquireConnectionHelper.StartCheckingOut()
at MongoDB.Driver.Core.ConnectionPools.ExclusiveConnectionPool.AcquireConnectionHelper.AcquireConnectionAsync(CancellationToken cancellationToken)
at MongoDB.Driver.Core.ConnectionPools.ExclusiveConnectionPool.AcquireConnectionAsync(CancellationToken cancellationToken)
at MongoDB.Driver.Core.Servers.Server.GetChannelAsync(CancellationToken cancellationToken)原因是mongo线程池用完了,主要是因为我们游戏的特殊性,在某些时间点会进行过多的保存,导致这时候很容易出现线程池用完了。解决方案就是在大量写的时候不要单独一个个去update,而是通过BulkWrite批量进行写。但是这一块改动还是比较大的,思路就是每个对象有个dirty标记,没60s遍历所有对象的dirty标记,标记过的加入到list中进行bulkwrite。
逻辑bug
其他就是一些逻辑bug,通过报错慢慢发现解决。
3. 业务开发
3D项目随着策划方案集中产出,服务端程序压力有点大,我一起参与到业务开发。这项目是基于skynet的,好久没用lua写逻辑了,有点不太习惯。