本文汇总了 2024 年 11 月 9 日 - 2024 年 11 月 15 日 Unity 中文社区精选问答。如果在使用 Unity 过程中遇到任何问题,欢迎点击阅读原文前往 Unity 中文社区提问,将有官方技术支持及社区贡献者当日解答。此外,本周还有少量待解决问题,欢迎小伙伴们到社区分享经验,为他人答疑解惑。
本期问题目录:
8. 如何在 UVS 中使用 dotween
团结引擎:
9. 鸿蒙应用卡死
10. 团结引擎项目打开时出现的问题
11. 团结引擎打鸿蒙包,UGUI 显示的位置,和触发点击事件的位置不一致
12. GetOrAddComponent 代码写错了
13. 组织合作项目怎么在成员间共享呀
14. 团结引擎鸿蒙平台获取 cpu 主频有问题
技术支持:
我对 urp 的 shadow distance 设置为 20 米。然后平行光的 X 轴为 90,让平行光正对着地面。相机也在地面很近的距离。在相机的正上方有一个立方体,坐标(0,200,0),所以这个立方体在相机的上方 200 米高空,但是相机依然可以看到地面出现了立方体的阴影。我去看 frame debugger 帧分析器,也能在阴影贴图看到这个立方体。我想知道,立方体的高度为 200 米,已经超过了 shadow distance 的 20 米,但是为什么阴影贴图中依然能看到这个立方体?
是相机到影子的距离。
Q2.发布程序报错
跟着站内入门教程操作,在发布并运行程序时出现了如下报错:
根据报错信息,您的问题主要是由于无法读取 Android 调试密钥(debug.keystore),提示密钥库格式无效。以下是解决步骤:
找到您的 debug.keystore 文件,路径通常是 C:\Users\ 您的用户名\.android\debug.keystore。
备份该文件以防万一。
删除该文件。
重新运行您的项目,系统会自动生成一个新的 debug.keystore 文件。
这样应该可以解决您的问题。如果问题依然存在,请尝试以下步骤:
确保您的 Java 环境变量配置正确。
确保您的 Gradle 版本与 Unity 版本兼容。
如果仍有问题,请提供更多的错误日志信息以便进一步诊断。
Q3.如何 webgl 和 vue 结合保证页面切换回来的时候原场景不重新加载
我的场景打包成 webgl 文件后需要放到浏览器中做展示,但是每次切换页面再切换回来之前的场景又要重新加载,如何能保持之前的状态不用重新加载?
答主 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 中退回个人许可证,然后重新申请一个。
为什么输出句点标识符后没有显示 intellisense 的选项列表,该如何主动显示?
解决方案管理器为什么空白?
答主 溜肉段:
你的脚本是杂项文件,需要把这个脚本包含进项目。简单粗暴的方法是把这个脚本的内容复制备份,然后把脚本删掉,建一个新的同名的脚本,然后把之前的内容复制进去就可以了,或者也可以重新生成一下解决方案,在 preference - External Tools 里重置一下脚本编辑器等方法。
Q7.Unity 2022 LTS 为什么每次点击运行都会出进度条
装入 dotween 插件后,可不可以直接在可视化中调用方法呢。难道只能用 C# 写方法然后被调用吗?
答主 溜肉段:
官方回答:
Hi,
Q10.团结引擎项目打开时出现的问题
团结 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 的坐标原点是屏幕的左下角,坐标是像素值。如果原点有偏移,建议检查设备分辨率和相机的设置。
public static T GetOrAddComponent<T>(this UnityObject uo) where T : Component
{
return uo.GetComponent<T>() ?? uo.AddComponent<T>();
}
这应该是团结自己加的方法把?但代码写错了,"??"对包装过的 null 不起效果。
您好,这个方法不属于 Tuanjie 加的代码。它属于“com.unity.visualscripting”这个内置包。在Unity中查找定义也会找到一样的源。
这只是一个拓展示例,要求自己去定义这个方法后才能使用,下面是大概的示例:
定义这个扩展方法:
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; } }
和朋友开了个组织但是回到软件界面后新增的文件朋友说看不到啊。
答主 溜肉段:
在这里 https://id.unity.cn,左侧组织选项,将您朋友添加进对应的组织内。
团结引擎鸿蒙平台获取 cpu 主频有问题,机型是 huawei mate60,这个机器有两个大核,主频是 2.6GHz,小核是 2.05GHz,通过 api SystemInfo.processorFrequency 获取出来时小核的主频,而且游戏运行起来比较卡顿,怀疑是用了小核运行主线程,请问怎么设置主线程在大核运行?
官方回答:
你好,引擎不会默认限制运行在哪个核上。建议看下 OH 系统的接口和权限设置能否修改在主线程运行。
团结引擎内,目前好像只能调用鸿蒙 ArkTs API;而对应华为提供的 CAPI(c 语言接口),在引擎内如何能够调用这些接口?
JS_Video_IsSeeking 这个 JS 方法,微信 sdk 在打包完后会将其替换为 SDK 的实现,如果当前使用的微信 sdk 里面没有这个方法的实现,就会报错。一般可以通过升级微信 SDK 版本,或者降低引擎版本来解决。
Q17.其他平台转到小程序平台后烘培 lightmap 效果变暗
针对你在不同平台之间转换时光照贴图效果变暗的问题,特别是在小程序平台上,以下是一些可能的解决方案:
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 中找到相关设置,并确保启用了自动烘焙。
来了解各个平台的压缩格式。
团结引擎使用 URP 创建的空工程转换到微信小游戏运行黑屏并报错,不适用 URP 没有问题。用的 webGl 1.0。
使用 WebGL2。
启动时,在编辑器 scene 中,经常需要点击相应的 UI,但需要点击的 UI,顶部有很多其它层,要连点击很多次才能选中自己想要的 UI。虽然可以通过鼠标点击 Hierarchy 面板上相应的小指头控制对象的可拾取性,但每次都要重新,很麻烦(面板上的对象都是动态加上去的,所以每次都要重新点击小指头)。
故:如何通过代从 Hierarchy 窗口控制对象在场景中的可拾取性?
EditorApplication.hierarchyWindowItemOnGUI // 已获得相应的对象,如何设置其可拾取性?
团结 MuseChat 已解决:
using UnityEditor;
using UnityEngine;
public class SetPickability : MonoBehaviour
{
[ ]
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.");
}
}
}
这样,每次启动时,你都可以通过运行这个菜单项来自动设置对象的可拾取性,而不需要手动点击 Hierarchy 面板上的小指头。