89. 2023-12-03周总结

  1. 场景动效实现方案
  2. 线上一些报错
  3. 业务开发

1. 场景动效实现方案

有个动效需求,点击一个可交互物体(比如一块石头),交互物体碎裂并炸出一系列小物体,然后点击小物体,小物体一起飞到UI界面的背包按钮上。

这里有几个方面要实现:

  1. 交互物体炸裂出小物体
    这一块美术那边提供的方案是使用支持碰撞的粒子做的,并且为了适应多个可交互物体,粒子是一个空粒子,程序动态的给他设置产生的网格和材质。

  2. 小物体如何触发点击
    因为是粒子做的,所以没法给单个小物体挂collider进行交互,因为最终的小物体都会掉落在地面,并且所有小物体都可以通过GetParticles拿到每个小物体的坐标,所以用了一个折中的方案,地面上面增加点击触发器,通过点击到的地面位置进而判断是否点击到了小物体

  3. 小物体如何一起飞到UI界面背包按钮上
    美术提供一个shader,将所有散落的小物件粒子聚合飞往一个3D世界的目标点,有了这个之后,技术就是需要动态(因为适配原因,UI位置会变)的将这个目标点生成出来即可。

UI控件转3D世界坐标代码

1
2
var screenPos = RectTransformUtility.WorldToScreenPoint(uiCamera, image.transform.position);
cube.position = camera.ScreenToWorldPoint(new Vector3(screenPos.x, screenPos.y, 10)); // 10表示距离摄像机的距离,可自行调整

2. 线上一些报错

  1. GeneratorId报错
    有个地方用自增的方式来生成唯一id,并用一个hashset存储已经用过的id,防止重复生成。但线上发现会报错:

    1
    2
    3
    Index 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) 进行加锁了,暂时还找不到问题。

  2. Mongo报错

    1
    2
    3
    4
    5
    6
    MongoDB.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。

  3. 逻辑bug
    其他就是一些逻辑bug,通过报错慢慢发现解决。

3. 业务开发

3D项目随着策划方案集中产出,服务端程序压力有点大,我一起参与到业务开发。这项目是基于skynet的,好久没用lua写逻辑了,有点不太习惯。