社区问答 | 本周问答汇总 1109-1115

文摘   科技   2024-11-15 20:00   上海  

本文汇总了 2024 年 11 月 9 日 - 2024 年 11 月 15 日 Unity 中文社区精选问答。如果在使用 Unity 过程中遇到任何问题,欢迎点击阅读原文前往 Unity 中文社区提问,将有官方技术支持及社区贡献者当日解答此外,本周还有少量待解决问题,欢迎小伙伴们到社区分享经验,为他人答疑解惑。

本期问题目录:

新手答疑:
1. 关于阴影贴图的问题
2. 发布程序报错
3. 如何 webgl 和 vue 结合保证页面切换回来的时候原场景不重新加载
4. 为什么第一次的 print 输出 true,第二次为 false
5. 包管理器检查更新卡住
6. 如何主动显示 Intellisense
7. Unity 2022 LTS 为什么每次点击运行都会出进度条

8. 如何在 UVS 中使用 dotween

团结引擎:

9. 鸿蒙应用卡死

10. 团结引擎项目打开时出现的问题

11. 团结引擎打鸿蒙包,UGUI 显示的位置,和触发点击事件的位置不一致

12. GetOrAddComponent 代码写错了

13. 组织合作项目怎么在成员间共享呀

14. 团结引擎鸿蒙平台获取 cpu 主频有问题

15. 团结引擎内,如何调用或使用鸿蒙 C API 接口
微信小游戏:
16. 官方 demo 导出微信小程序
17. 其他平台转到小程序平台后烘培 lightmap 效果变暗
18. 打包成微信小游戏启动黑屏,只有声音没有画面
19. 团结引擎使用 URP 创建的空工程转换到微信小游戏运行黑屏并报错

技术支持:

20. 如何通过代码设置编辑器中 Hierarchy 面板的手指头(可拾取性)?
新手答疑
  Q1.关于阴影贴图的问题

我对 urp 的 shadow distance 设置为 20 米。然后平行光的 X 轴为 90,让平行光正对着地面。相机也在地面很近的距离。在相机的正上方有一个立方体,坐标(0,200,0),所以这个立方体在相机的上方 200 米高空,但是相机依然可以看到地面出现了立方体的阴影。我去看 frame debugger 帧分析器,也能在阴影贴图看到这个立方体。我想知道,立方体的高度为 200 米,已经超过了 shadow distance 的 20 米,但是为什么阴影贴图中依然能看到这个立方体?  

答主 UnityJun24

是相机到影子的距离

  Q2.发布程序报错

跟着站内入门教程操作,在发布并运行程序时出现了如下报错:

团结 Muse Chat 已解决:

根据报错信息,您的问题主要是由于无法读取 Android 调试密钥(debug.keystore),提示密钥库格式无效。以下是解决步骤:

找到您的 debug.keystore 文件,路径通常是 C:\Users\ 您的用户名\.android\debug.keystore。

备份该文件以防万一。

删除该文件。

重新运行您的项目,系统会自动生成一个新的 debug.keystore 文件。

这样应该可以解决您的问题。如果问题依然存在,请尝试以下步骤:

确保您的 Java 环境变量配置正确。

确保您的 Gradle 版本与 Unity 版本兼容。

如果仍有问题,请提供更多的错误日志信息以便进一步诊断。

  Q3.如何 webgl 和 vue 结合保证页面切换回来的时候原场景不重新加载

我的场景打包成 webgl 文件后需要放到浏览器中做展示,但是每次切换页面再切换回来之前的场景又要重新加载,如何能保持之前的状态不用重新加载?

答主 Mark:
嵌入前端页面,设置 z-index 的为负数。将 webgl 置于底层就可以。
  Q4.为什么第一次的 print 输出 true,第二次为 false

答主 beiji:

ogn=fromData 表示他们指向的是同一个东西,要想 fromData 变化,ogn 不变,就不能直接使用 = 赋值,可以 new 然后逐个属性赋值,或者在 SlotData 里面写一个 Copy 的方法实现,大概如下: 

void Copy():SlotData { SlotData newSlotData =new SlotData(); newSlotData.item = this.item; newSlotData.count = this.count; newSlotData.OnChange = this.OnChange; return newSlotData; }

然后修改 ogn 赋值的地方,SlotData ogn = fromData.Copy();

  Q5.包管理器检查更新卡住

包管理器正在检查更新一直转圈圈,求解决方法。

自答:

到 Unity Hub 中退回个人许可证,然后重新申请一个。

  Q6.如何主动显示 Intellisense

为什么输出句点标识符后没有显示 intellisense 的选项列表,该如何主动显示?

解决方案管理器为什么空白?

答主 溜肉段:

你的脚本是杂项文件,需要把这个脚本包含进项目。简单粗暴的方法是把这个脚本的内容复制备份,然后把脚本删掉,建一个新的同名的脚本,然后把之前的内容复制进去就可以了,或者也可以重新生成一下解决方案,在 preference - External Tools 里重置一下脚本编辑器等方法。

  Q7.Unity 2022 LTS 为什么每次点击运行都会出进度条

重装和重启都没有作用

团结 Muse Chat 已解决:
您好,Unity 2022 LTS 在每次点击运行时都会出现进度条,这可能是因为默认情况下 Unity 会在进入运行模式时重新加载场景。您可以尝试以下步骤来禁用场景重新加载,从而减少进度条的出现:
打开 Unity 编辑器,进入菜单栏的 Edit > Project Settings > Editor。
确保启用了 Enter Play Mode Options。
禁用 Reload Scene 选项。
这样可以避免每次进入运行模式时重新加载场景,从而减少进度条的出现时间。

  Q8.如何在 UVS 中使用 dotween

装入 dotween 插件后,可不可以直接在可视化中调用方法呢。难道只能用 C# 写方法然后被调用吗?

答主 溜肉段:

UVS DOTween Engine (For Unity's Visual Scripting):

https://assetstore.unity.com/packages/tools/visual-scripting/uvs-dotween-engine-for-unity-s-visual-scripting-280532

看下这个插件是否有帮助。
团结引擎
  Q9.鸿蒙应用卡死
从 c# 调用 ets 代码时,如果传入的 bytes 大于 12M 左右时,整个 app 会卡死,屏幕无法操作,但是 app 还活着,点击屏幕时,鸿蒙日志也是有交互反映的。

官方回答:

Hi,

由于直接使用 new byte[] 来作为参数的时候,引擎默认当成是一个 int 数据去 js 层创建 array,由于长度过长,导致耗时极其的长,所以并不是出现卡死,而是执行耗时非常非常的长。建议换成使用 OpenHarmonyJSArrayBuffer,他会把他当成一个块内存直接传递到 js 那边去。
OpenHarmonyJSArrayBuffer jsArrayBuffer = new OpenHarmonyJSArrayBuffer(13000000); jsArrayBuffer.SetValue(new byte[13000000]); OpenHarmonyJSObject jsObject = new OpenHarmonyJSObject("HarTestPlugin"); jsObject.Call("DecryptBytes", jsArrayBuffer);

  Q10.团结引擎项目打开时出现的问题

每次用团结引擎打开项目都会显示 “Your Project has license mixusage, some funtion may not work properly.",而且进行项目开发时,已打开项目的资源相比较于 Plastic SCM 上的资源少很多,进行资源导入时,打开相应文件夹显示为空文件夹,可是在我的电脑上进行查找时并不是空文件夹(寻找路径相同),这种问题怎么解决啊?求帮助。

团结 Muse Chat 已解决:

这个问题涉及到两个方面:一个是项目的许可证混用问题,另一个是 Plastic SCM 资源同步问题。根据我查找到的信息,以下是解决方案:

1. 许可证混用问题:

  • 团结引擎(Unity)不允许在同一个项目中混用不同的许可证类型(例如免费版和付费版)。如果项目中有多个开发者使用不同的许可证类型,会导致“Your Project has license mixusage, some function may not work properly.”的错误。

  • 解决方法是确保所有参与项目的开发者使用相同类型的许可证。如果有开发者需要使用付费版的功能,建议所有开发者都升级到相同的付费版许可证。

2. Plastic SCM 资源同步问题:

  • 当从 Plastic SCM 克隆项目时,出现文件夹为空的情况,可能是由于权限问题或同步设置问题。

  • 解决方法:确保克隆时选择了正确的分支。如果默认克隆的是自己的分支,而代码在主分支上,需要手动将主分支的代码合并到自己的分支再进行克隆;检查本地文件夹的权限,确保有足够的权限进行读写操作;尝试使用 Plastic SCM 的命令行工具进行克隆操作,确保克隆命令正确无误。例如:

cm clone <src_rep>@<src_rep_server> [dst_rep_server]

  Q11.团结引擎打鸿蒙包,UGUI 显示的位置,和触发点击事件的位置不一致

实际可以点击的位置,和图片显示的位置并不一致,比如我在屏幕中间有个按钮,但是实际上我要点击屏幕上方偏移很远的地方才可以点击到这个按钮。
另外还有个问题如下:
// Update is called once per frame
private void Update()
{
if (Input.touchCount == 1)
{
var touch = Input.GetTouch(0);
Debug.LogError("点击位置:x =" + touch.position.x + " y = " + touch.position.y);
}
}

上述代码打印显示 touch.position 的原点莫名其妙跑到屏幕的左边上下居中的地方了,Unity 是有什么接口可以改变这个中心点吗,现在完全没有头绪,有没有大佬解答一下呀?

官方回答:

默认情况下,Touch.position 的坐标原点是屏幕的左下角,坐标是像素值。如果原点有偏移,建议检查设备分辨率和相机的设置。

  Q12.GetOrAddComponent 代码写错了

 public static T GetOrAddComponent<T>(this UnityObject uo) where T : Component    {        return uo.GetComponent<T>() ?? uo.AddComponent<T>();    }

这应该是团结自己加的方法把?但代码写错了,"??"对包装过的 null 不起效果。

官方回答:

您好,这个方法不属于 Tuanjie 加的代码。它属于“com.unity.visualscripting”这个内置包。在Unity中查找定义也会找到一样的源。

https://docs.unity3d.com/Packages/com.unity.visualscripting@1.5/api/Unity.VisualScripting.ComponentHolderProtocol.html#UnityVisualScripting_ComponentHolderProtocol_GetOrAddComponent__1_UnityEngine_Object

这只是一个拓展示例,要求自己去定义这个方法后才能使用,下面是大概的示例:

定义这个扩展方法:

using UnityEngine; public static class GameObjectExtensions { public static T GetOrAddComponent<T>(this GameObject gameObject) where T : Component { T component = gameObject.GetComponent<T>(); if (component == null){ component = gameObject.AddComponent<T>(); } return component; } }

然后才能在其他代码中使用这个方法。

using UnityEngine; public class NewBehaviourScript : MonoBehaviour { void Start(){ Rigidbody rb = gameObject.GetOrAddComponent<Rigidbody>(); rb.mass = 5; rb.drag = 1; } }
  Q13.组织合作项目怎么在成员间共享呀

和朋友开了个组织但是回到软件界面后新增的文件朋友说看不到啊。

答主 溜肉段:

在这里 https://id.unity.cn,左侧组织选项,将您朋友添加进对应的组织内。

  Q14.团结引擎鸿蒙平台获取 cpu 主频有问题

团结引擎鸿蒙平台获取 cpu 主频有问题,机型是 huawei mate60,这个机器有两个大核,主频是 2.6GHz,小核是 2.05GHz,通过 api SystemInfo.processorFrequency 获取出来时小核的主频,而且游戏运行起来比较卡顿,怀疑是用了小核运行主线程,请问怎么设置主线程在大核运行?

官方回答:

你好,引擎不会默认限制运行在哪个核上。建议看下 OH 系统的接口和权限设置能否修改在主线程运行。

  Q15.团结引擎内,如何调用或使用鸿蒙 C API 接口

团结引擎内,目前好像只能调用鸿蒙 ArkTs API;而对应华为提供的 CAPI(c 语言接口),在引擎内如何能够调用这些接口?

官方回答:
你好,引擎不支持调用 C API 哈。可以自己导出工程写 c++ 代码。
微信小游戏
  Q16.官方 demo 导出微信小程序
使用官方 demo 导出微信小程序,报以下错误,大佬们,救救!
官方回答:

JS_Video_IsSeeking 这个 JS 方法,微信 sdk 在打包完后会将其替换为 SDK 的实现,如果当前使用的微信 sdk 里面没有这个方法的实现,就会报错。一般可以通过升级微信 SDK 版本,或者降低引擎版本来解决。

  Q17.其他平台转到小程序平台后烘培 lightmap 效果变暗

其他平台转到小程序平台后烘培 lightmap 效果变暗,目前排除了模型贴图等原因,灯光为 baked,gpu 渲染,使用小程序格式 RGB(A) Compressed ASTC 8x8 block烘培后烘培 lightmap 变暗,其他平台没有变色问题。
团结 Muse Chat 已解决:

针对你在不同平台之间转换时光照贴图效果变暗的问题,特别是在小程序平台上,以下是一些可能的解决方案:

1. 检查颜色空间设置:确保你的项目在所有平台上使用相同的颜色空间设置(线性或伽马)。在 Unity 中,颜色空间设置可以在 Edit > Project Settings > Player > Other Settings > Color Space 中进行调整。如果你在一个平台上使用线性空间,而在另一个平台上使用伽马空间,可能会导致光照贴图效果的差异。

2. 调整光照贴图的编码和压缩设置:在小程序平台上,光照贴图的编码和压缩格式可能会影响最终的渲染效果。你可以尝试调整光照贴图的编码设置,具体步骤如下:

  • 转到 Edit > Project Settings > Player > Other Settings > Lightmap Encoding。

  • 选择 High Quality 以启用 HDR 光照贴图支持,或者选择 Normal Quality 使用 RGBM 编码。

3. 检查光照贴图的导入设置:确保在导入光照贴图时,正确设置了纹理类型。你可以在 Texture Importer 中将光照贴图的 Texture Type 设置为 Lightmap,以确保在导入时绕过 sRGB 采样。

4. 重新烘焙光照贴图:在更改颜色空间或编码设置后,建议重新烘焙光照贴图。你可以在 Window > Rendering > Lighting 中找到相关设置,并确保启用了自动烘焙。

5. 检查平台特定的压缩格式:不同平台可能使用不同的压缩格式,这也会影响光照贴图的效果。你可以参考 Unity 文档中的光照贴图技术信息 
https://docs.unity.cn/cn/tuanjiemanual/Manual/Lightmaps-TechnicalInformation.html

来了解各个平台的压缩格式。

  Q18.打包成微信小游戏启动黑屏,只有声音没有画面
完全没思路,也没有报错,采用 UOS CDN 方案,请官方大大解决下谢谢。
UOS 平台上貌似没有消耗流量,貌似小程序没有拉取资源,不知道什么原因,能否排查下?
看见一些报错不知道是不是关键原因,不知道如何解决,这些 shader 在源码中也找不到。
官方回答:
指定使用 WebGL2 在 WXSDK 转换界面“调试编译选项” 中勾选 “WebGL2.0(beta)”。CDN 未拉取到资源,要检查下“游戏资源 CDN”的设置路径是否正确,确保是 https 协议路径。
  Q19.团结引擎使用 URP 创建的空工程转换到微信小游戏运行黑屏并报错

团结引擎使用 URP 创建的空工程转换到微信小游戏运行黑屏并报错,不适用 URP 没有问题。用的 webGl 1.0。

官方回答:

使用 WebGL2。

技术支持
  Q20.如何通过代码设置编辑器中 Hierarchy 面板的手指头(可拾取性)?

启动时,在编辑器 scene 中,经常需要点击相应的 UI,但需要点击的 UI,顶部有很多其它层,要连点击很多次才能选中自己想要的 UI。虽然可以通过鼠标点击 Hierarchy 面板上相应的小指头控制对象的可拾取性,但每次都要重新,很麻烦(面板上的对象都是动态加上去的,所以每次都要重新点击小指头)。

故:如何通过代从 Hierarchy 窗口控制对象在场景中的可拾取性?

EditorApplication.hierarchyWindowItemOnGUI // 已获得相应的对象,如何设置其可拾取性?

团结 MuseChat 已解决:

你可以通过以下代码来设置编辑器中 Hierarchy 面板的对象可拾取性:
using UnityEditor;using UnityEngine;
public class SetPickability : MonoBehaviour{ [MenuItem("Tools/Set Pickability")] static void SetObjectPickability() { // 获取需要设置可拾取性的对象 GameObject targetObject = GameObject.Find("YourGameObjectName");
if (targetObject != null) { // 设置对象为不可拾取 SceneVisibilityManager.instance.DisablePicking(targetObject, true); Debug.Log($"{targetObject.name} is now unpickable."); } else { Debug.LogError("Target object not found."); } }}
在上述代码中,你可以通过 GameObject.Find 方法找到需要设置可拾取性的对象,并使用 SceneVisibilityManager.instance.DisablePicking 方法将其设置为不可拾取。你可以根据需要修改 targetObject 的获取方式和名称。

这样,每次启动时,你都可以通过运行这个菜单项来自动设置对象的可拾取性,而不需要手动点击 Hierarchy 面板上的小指头。


本系列问题汇总将每周更新,欢迎点击阅读原文,与 Unity 中文社区成员一起答疑互助,共同进步。
长按关注
Unity 官方开发者服务平台
第一时间了解 Unity 社区动向,学习开发技巧

 点击“阅读原文”,访问 Unity 社区问答



Unity官方开发者服务平台
Unity引擎官方开发者服务平台,分享技术干货、学习课程、产品信息、前沿案例、活动资讯、直播信息等内容。
 最新文章