本文汇总了 2024 年 9 月 21 日 - 2024 年 9 月 27 日 Unity 中文社区精选问答。如果在使用 Unity 过程中遇到任何问题,欢迎点击阅读原文前往 Unity 中文社区提问,将有官方技术支持及社区贡献者当日解答。此外,本周还有少量待解决问题,欢迎小伙伴们到社区分享经验,为他人答疑解惑。
本期问题目录:
7. netcode 问题
8. 在信号处理函数中无法获取完整 C# 栈
技术交流:
9. 关于 collision.GetComponent<脚本名字>(). 方法会导致系统报错却任然可以正常运行的问题
10. sence 画面和 game 画面颜色不一样
11. 关于打包鸿蒙安装包时包体大小的疑问
微信小游戏:
12. 微信小游戏分享失败
云开发:
13. 为什么切换不了组织了?
Q2.动画动作切换
当动画动作切换时,比如按下方向键由 idle 切换到 running 时,会有一个 idle 滑动的状态后,才会开始跑起来。或者松开方向键由 running 切换到 idle 时,会原地跑步。
想做类似 RPGmaker 结构的游戏,类似《雨血》系列这种,但非常不想要 RPGmaker,实在太限制而且没教程。
想学如何丰富战斗系统,比如技能设计、动作关键帧判定、各种 buff/debuff 设计等;
另外架构思维和内容设计的教程几乎没有,大部分都是做个 DEMO,代码不像做产品那样条理规整,希望大佬们推荐个学习路线~
https://learn.u3d.cn/tutorial/unity-tbs
答主 溜肉段:
可以看下 Unity 6 的文档~
官方回答:
更新一下你的安卓 sdk 版本。
官方回答:
把 Time.timeScale=0 注释掉试试。
Q7.netcode 问题
[Netcode] A ConnectionApproval callback is defined but ConnectionApproval is disabled. In order to use ConnectionApproval it has to be explicitly enabled ConnectionApproval 设置为 true 的时候,数据传入 ConnectionData,会报上面的 warn,怎么解决?本地局域网的连接。
团结 MuseChat 已解决:
在回调函数中处理传入的 ConnectionData,并根据你的逻辑决定是否批准连接。
在安卓应用崩溃后尝试获取 C# 栈。但是在崩溃的信号处理函数中调用 StackTraceUtility.ExtractStackTrace() 或者 Environment.StackTrace,获取的栈中只有 C# 回调函数,没有崩溃前的栈,请问这是个 bug 还是特性?动态库代码:
typedef char* (*CrashCallback)();
static CrashCallback gUserCallback = nullptr;
struct sigaction old_handler;
//调用C#函数GetCsharpStacktrace()获取C#栈
extern "C" void callCsharpFunc() {
if (gUserCallback) {
LOGI("Call user callback");
char *stack = gUserCallback();
if (stack != nullptr) {
LOGI("c# stack: %s", stack);
}
} else {
LOGI("No user callback registered");
}
}
//崩溃信号处理函数
void SignalHandler(int sig, siginfo_t* info, void* uc) {
callCsharpFunc();
if (sigaction(SIGSEGV, &old_handler, NULL) == -1) {
signal(SIGSEGV, SIG_DFL);
}
_exit(1);
}
//注册崩溃信号处理函数
extern "C" void installSigHandler() {
if (sigaction(SIGSEGV, NULL, &old_handler) == -1) {
return;
}
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_sigaction = SignalHandler;
sa.sa_flags = SA_SIGINFO;
if (sigaction(SIGSEGV, &sa, NULL) == -1) {
LOGI("sigaction fail");
}
LOGI("installSigHandler ok");
}
//保存C#回调函数指针
extern "C" void registerCrashCallback(CrashCallback crashCallback) {
gUserCallback = crashCallback;
LOGI("registerCrashCallback ok");
}
//抛信号,造成崩溃
extern "C" void makeCrash() {
LOGI("make crash");
raise(SIGSEGV);
}
using AOT;
using System;
using System.Runtime.InteropServices;
using UnityEngine;
class MyClass
{
public delegate string CrashCallback();
[ ]
public static extern void installSigHandler();//注册SIGSEGV信号处理函数
[ ]
public static extern void registerCrashCallback(CrashCallback crashCallback);//注册C#函数
[ ]
public static extern void callCsharpFunc();//从Native层直接调用C#函数
[ ]
public static extern void makeCrash();
[ ]
public static string GetCsharpStacktrace()//注册到Native层的回调函数
{
return StackTraceUtility.ExtractStackTrace();
}
[ ]
static void OnRuntimeMethodLoad()
{
installSigHandler();
registerCrashCallback(GetCsharpStacktrace);
}
}
public class init : MonoBehaviour
{
private void OnGUI()
{
MyClass.callCsharpFunc();//调用注册到动态库中的C#函数
MyClass.makeCrash();//在信号处理函数中调用C#函数
}
}
logcat 打印的崩溃前的栈:
MyClass:GetCsharpStacktrace()
MyClass:callCsharpFunc()
ConsoleToScreen:OnGUI()
MyClass:GetCsharpStacktrace()
我给我游戏里的敌人的脚本添加了一个方法 BeAttacked(),然后想要在我的攻击命中敌人(也就是两者的碰撞检测器相碰撞时)调用这个方法。
但是我现在遇到一个很奇怪的问题,我使用的是 collision.GetComponent
笨办法挨个试了一下发现是 Random.Range() 的问题。
团结 MuseChat 已解决:
答主 溜肉段:
hap 是鸿蒙的程序包,包体大小您可以参考下文档,调整一下设置,优化一下代码资源等~
确定下权限和 appid~
但是在 UnityHub 中点入“打开远程项目”的时候却只有一个组织,无法切换。
尝试下去添加新组织,在下拉列表中选择另一个组织进入。云开发组织需要先开通,才能在切换组织那里出现。
答主 zmrTUvbpkd:
会不会是以 sprite renderer 的 Sprite Sort Point 为排序,而不是以图片的锚点排序。老版本和新版本不一样了,图片锚点设置成底部,再把 sprite renderer 里 Sprite Sort Point 设置成 Pivot 就可以了。