本文汇总了 2024 年 10 月 1 日 - 2024 年 10 月 12 日 Unity 中文社区精选问答。如果在使用 Unity 过程中遇到任何问题,欢迎点击阅读原文前往 Unity 中文社区提问,将有官方技术支持及社区贡献者当日解答。此外,本周还有少量待解决问题,欢迎小伙伴们到社区分享经验,为他人答疑解惑。
本期问题目录:
4. 无云端项目,找不到 Plastic SCM 中团队的项目
团结引擎:
5. 团结引擎 1.3 版本导出开源鸿蒙项目在 Deveco 中报错
技术支持:
7. 如何使用 SimpleFileBrowser 插件来使用文件对话框功能
8. Create the same asset using AssetDatabase.CreateAsset(asset, path), the current scene is missing
10. 打包微信小游戏后不能点击了
云开发:
11. 无法拉取远程仓库,找不到目标组织
我在使用 Netcode 网络框架的时候,客户机执行 NetworkManager.Singleton.StartClient() 后,服务器就会出现
NullReferenceException: Object reference not set to an instance of an object Unity.Netcode.NetworkConnectionManager.ApproveConnection (Unity.Netcode.ConnectionRequestMessage& connectionRequestMessage, Unity.Netcode.NetworkContext& context) (at ./Library/PackageCache/com.unity.netcode.gameobjects@1.8.1/Runtime/Connection/NetworkConnectionManager.cs:658)
并且挂载了 NetworkObject 的组件被销毁了。
找到问题了,勾选了 Connection Approval,需要实现。
Q2.Unity 打不开
具体情况如下:断网双击 Unity,在任务管理器中发现 Unity Editor 运行一会自动消失,没其他任何反应。电脑连接手机热点后,双击 Unity,情况和以上一样。最终连接下载 Unity 的网络后,双击 Unity,自动打开 Unity Hub,然后成功打开Unity。我的需求是离线编程,和改换网络环境后仍能正常运行。
使用的是个人免费版,平台是 windows 10。
最后解决方法 You must delete the license file and then activate a new license on current machine.
具体操作是:连接的网络环境发生了更改就必须在 Unity Hub 中先退还许可证,然后再添加许可证。然后在当前网络中就可打开 Unity。Unity 为防止盗用必须联网使用,至少在打开时要连接网络,不然会闪退。
原因分析:Machine binding 5 mismatch: (value of current machine) a4:b1:c1:15:45:a5 != 7a:71:9d:f6:5c:46 (value in license file)。由此可见在更改网络环境后,本机的 mac 地址会发生变化,即无线局域网适配器 WLAN 的 MAC 地址会变化,所以会导致该问题。Unity 为防止盗用一个 mac 地址只能登记一个机器。
Q3.How to unlock TileFlags.LockTransform
I need manual set transform to my Tile, but i can not unlock by Script like this:
TileBase tile = tilemap.GetTile(targetPosition);
if (tile != null && tile is RuleTile ruleTile)
{
TileFlags flags = tilemap.GetTileFlags(targetPosition);
flags &= ~TileFlags.LockTransform;
flags);
tilemap.RefreshTile(targetPosition);
}
要通过脚本解锁 TileFlags.LockTransform 并手动设置 Tile 的变换,可以创建一个自定义的 Tile 类,并在 GetTileData 方法中设置 TileFlags.None。以下是完整的示例代码:
using UnityEngine;
using UnityEngine.Tilemaps;
public class CustomTile : TileBase
{
public Sprite sprite;
public override void GetTileData(Vector3Int position, ITilemap tilemap, ref TileData tileData)
{
tileData.sprite = sprite;
tileData.color = Color.white;
tileData.transform = Matrix4x4.identity;
tileData.flags = TileFlags.None; // 不锁定变换
tileData.colliderType = Tile.ColliderType.None;
}
}
public class TilemapController : MonoBehaviour
{
public Tilemap tilemap;
public CustomTile customTile;
void Start()
{
Vector3Int targetPosition = new Vector3Int(0, 0, 0);
tilemap.SetTile(targetPosition, customTile);
// 手动设置变换矩阵
Matrix4x4 transformMatrix = Matrix4x4.TRS(new Vector3(1, 1, 0), Quaternion.Euler(0, 0, 45), Vector3.one);
tilemap.SetTransformMatrix(targetPosition, transformMatrix);
tilemap.RefreshTile(targetPosition);
}
}
官方回答:
答主 溜肉段:
可以把路径改成全英文再试试。
团结 MuseChat 已解决:
要在 Unity 中使用 SimpleFileBrowser 插件来打开文件对话框,请按照以下步骤操作:
安装插件:
从 GitHub https://github.com/yasirkula/UnitySimpleFileBrowser 下载 SimpleFileBrowser 插件,并将其导入到 Unity 项目中。
或者从 Unity Asset Store https://assetstore.unity.com/packages/tools/gui/runtime-file-browser-113006 导入插件。
在脚本中引用插件:在你的 C# 脚本中添加 using SimpleFileBrowser;。
显示文件对话框:你可以使用以下代码来显示文件对话框:
using UnityEngine;
using System.Collections;
using SimpleFileBrowser;
public class FileBrowserTest : MonoBehaviour
{
void Start()
{
// 设置文件过滤器(可选)
FileBrowser.SetFilters(true, new FileBrowser.Filter("Images", ".jpg", ".png"), new FileBrowser.Filter("Text Files", ".txt", ".pdf"));
// 设置默认过滤器(可选)
FileBrowser.SetDefaultFilter(".jpg");
// 设置排除的文件扩展名(可选)
FileBrowser.SetExcludedExtensions(".lnk", ".tmp", ".zip", ".rar", ".exe");
// 添加快速链接(可选)
FileBrowser.AddQuickLink("Users", "C:\\Users", null);
// 显示加载文件对话框
FileBrowser.ShowLoadDialog(
(paths) => { Debug.Log("Selected: " + paths[0]); },
() => { Debug.Log("Canceled"); },
FileBrowser.PickMode.Files,
false,
null,
null,
"Select File",
"Load"
);
}
}
void OnFilesSelected(string[] filePaths)
{
foreach (string path in filePaths)
{
Debug.Log(path);
}
}
使用协程显示文件对话框(可选):你也可以使用协程来显示文件对话框并等待用户选择:
IEnumerator ShowLoadDialogCoroutine()
{
yield return FileBrowser.WaitForLoadDialog(FileBrowser.PickMode.Files, true, null, null, "Select Files", "Load");
if (FileBrowser.Success)
{
OnFilesSelected(FileBrowser.Result);
}
}
通过以上步骤,你可以在 Unity 中使用 SimpleFileBrowser 插件来打开文件对话框。
Q8. Create the same asset using AssetDatabase.CreateAsset(asset, path), the current scene is missing
PlayerData .cs
using UnityEngine;
public class PlayerData : ScriptableObject {
public string id;
}
Player.cs
using UnityEngine;
public class Player : MonoBehaviour {
public PlayerData data;
}
TestCreateAsset .cs Placed in the Editor folder
using UnityEditor;
using UnityEngine;
public class TestCreateAsset : Editor {
[ ]
private static void Test() {
PlayerData playerData = ScriptableObject.CreateInstance<PlayerData>();
playerData.id = "aa";
const string path = "Assets/playerData.asset";
AssetDatabase.CreateAsset(playerData, path);
AssetDatabase.Refresh();
}
}
3. After completing the above operations, using Tools / TestCreateAsset again to create Assets/playerData.asset
Missing I checked .meta and playerData.asset and found no changes. How should I solve this problem?
已解决该问题,修改如下:
using System.IO;
using UnityEditor;
using UnityEngine;
public class TestCreateAsset : Editor {
[ ]
private static void Test() {
const string path = "Assets/playerData.asset";
PlayerData playerData;
bool isExists = File.Exists(path);
if (isExists) {
playerData = AssetDatabase.LoadAssetAtPath<PlayerData>(path);
playerData.id = "bb";
EditorUtility.SetDirty(playerData);
AssetDatabase.SaveAssetIfDirty(playerData);
} else {
playerData = ScriptableObject.CreateInstance<PlayerData>();
playerData.id = "aa";
AssetDatabase.CreateAsset(playerData, path);
}
AssetDatabase.Refresh();
}
}
社区回答:
在 MR 环境里面,Vision Pro 本来就会接受环境的自然光照,这是系统行为,如果他们想完全控制光照就要做 VR 模式。如果想消解这个影响,需要自己做个带光照的 IBL。
自答:
解决了,改回旧的 input manager 就可以了。
我的朋友已经将我设为他的项目管理员。我在我的 Unity 网页账户主页上可以看到我在他的组织里,并且是管理员身份。此时,我在 Unity Hub 中,点击“打开”右侧的箭头,点击“打开远程项目”,却只能看到我自己曾经创建的组织,而不能看到我朋友拉我进去的组织。问题如图所示。Hub 版本 3.3.2-c7