N
necode

  • 2024年5月14日
  • 注册于 2021年3月3日
  • ET_Newer 涉及到vs的sdk扩展了,我折腾了一段时间折腾不动还是用rider吧,期待vs大神来解决

  • 补充下,这样做虽然vs中能显示代码,但还是不推荐用vs,除非能解决在unity项目中创建脚本时dotnet项目能实时更新,以及解决vs对引用文件夹“简陋”的操作,无法像rider那样直接像操作源文件那样操作。所以还是用rider吧。

    • 假如客户端和服务端有两个添加了相同[Invoke(TimerInvokeType.xxx)]特性的类, 启动时会造成如题异常, 个人理解是由于7.0机器人合并到服务端且客户端能跑服务端, 如果服务器和客户端存在相同特性事件会造成触发客户端同时又触发了服务端, 反之也一样, 为了避免这种情况必须客户端和服务端分开了, 所以报异常的小伙伴只需要把客户端和服务端的Invoke分开下就能解决(6.0是[Timer(TimerType.xxxx)]), 如果理解有误希望指正

      • 可以,你不放到客户端跟服务端共用的代码中就行了,比如Config的Invoke

    • 请教下,ETCancellationToken这个如何正确复用,在看ETCancellationToken实现时,当调用ETCancellationToken.Cancel()方法会将成员变量actions设置为null,这导致ETCancellationToken在取消操作后无法继续使用,只能new一个新实例使用了,能否将ETCancellationToken.Invoke()方法中actions的置空操作(this.actions = null)改为clear操作(this.actions.clear()) ,这样在释放后复用不会报空指针,如果复用的话这样做正确吗

      • 不建议这个东西复用,很危险,不是每帧调用只占用一点点内存没必要

    • 根据串佬研究,将 OnGenerateCSProjectProcessor.cs 111行compile.AppendChild(link) 代码注释 VS就显示了。👍👍🤟

      补充:失败无效的重新生成一下目录,reimport一下asmdef

    • 编译成功,项目也能正常运行,并且在Rider下是没有问题的,但VS2022 社区版 无法显示项目代码,只有目录,请教如何解决

      • 编译过,项目按照使用说明也成功运行,并且在Rider中没有任何问题,VS不知道什么原因只有项目目录文件,没有代码,并且显示所有文件也没有代码,不知道是vs的bug还是我设置问题,请教如何让代码显示出来

        • 根据串佬研究,将 OnGenerateCSProjectProcessor.cs 111行compile.AppendChild(link) 代码注释 VS就显示了。👍👍🤟

          补充:失败无效的重新生成一下目录,reimport一下asmdef

      • Scorpio 感谢,我的疑惑是Action如何转换为ETTask,不好意思我没有表述清楚,然后仔细看了下原来在

        private void Run(TimerAction timerAction)
                {
                    switch (timerAction.TimerClass)
                    {
                        case TimerClass.OnceWaitTimer:
                        {
                            ETTask<bool> tcs = timerAction.Callback as ETTask<bool>;
                            this.Remove(timerAction.Id);
                            tcs.SetResult(true);
                            break;
                        }
                        case TimerClass.OnceTimer:
                        {
                            Action action = timerAction.Callback as Action;
                            this.Remove(timerAction.Id);
                            action?.Invoke();
                            break;
                        }
                        case TimerClass.RepeatedTimer:
                        {
                            Action action = timerAction.Callback as Action;
                            long tillTime = TimeHelper.ServerNow() + timerAction.Time;
                            this.AddTimer(tillTime, timerAction);
                            action?.Invoke();
                            break;
                        }
                    }
                }

        中根据TimerClass类型来区分了TimerAction结构体中Callback的类型,这样在switch语句的后两个case语句就将Callback 转成了Action了,解答了我的疑惑.

      • 标题:

        代码为
        case TimerClass.OnceWaitTimer:
        {
        ETTask<bool> tcs = timerAction.Callback as ETTask<bool>;
        this.Remove(timerAction.Id);
        tcs.SetResult(true);
        break;
        }
        不是很明白ETTask<bool> tcs = timerAction.Callback as ETTask<bool>; 这里是如何转成ETTask的

        • Scorpio 感谢,我的疑惑是Action如何转换为ETTask,不好意思我没有表述清楚,然后仔细看了下原来在

          private void Run(TimerAction timerAction)
                  {
                      switch (timerAction.TimerClass)
                      {
                          case TimerClass.OnceWaitTimer:
                          {
                              ETTask<bool> tcs = timerAction.Callback as ETTask<bool>;
                              this.Remove(timerAction.Id);
                              tcs.SetResult(true);
                              break;
                          }
                          case TimerClass.OnceTimer:
                          {
                              Action action = timerAction.Callback as Action;
                              this.Remove(timerAction.Id);
                              action?.Invoke();
                              break;
                          }
                          case TimerClass.RepeatedTimer:
                          {
                              Action action = timerAction.Callback as Action;
                              long tillTime = TimeHelper.ServerNow() + timerAction.Time;
                              this.AddTimer(tillTime, timerAction);
                              action?.Invoke();
                              break;
                          }
                      }
                  }

          中根据TimerClass类型来区分了TimerAction结构体中Callback的类型,这样在switch语句的后两个case语句就将Callback 转成了Action了,解答了我的疑惑.

      • Entity在添加组件时遇到组件重复添加到Components中 异常信息 : An item with the same key has already been added
        由于反序列化了组件后 , 没有设置Domain就进行了其他添加Component操作导致出现问题 , 解决办法就是在组件反序列化后第一时间设置Domain在进行其他操作即可