本文汇总了 2024 年 10 月 26 日 - 2024 年 11 月 1 日 Unity 中文社区精选问答。如果在使用 Unity 过程中遇到任何问题,欢迎点击阅读原文前往 Unity 中文社区提问,将有官方技术支持及社区贡献者当日解答。此外,本周还有少量待解决问题,欢迎小伙伴们到社区分享经验,为他人答疑解惑。
本期问题目录:
2. 我的 Unity hub 无法进行登录,点击 sign in 没有反应
团结引擎:
3. Unity 团结引擎导出 harmonyOS 工程运行报错
4. 团结引擎 1.3.1 的空工程在鸿蒙 5.0 模拟器崩溃
技术支持:
7. Cloud Code c# 获取 ServiceToken
8. Addressables.LoadAssetAsync 加载不到最新 AB
9. 游戏第一次运行会卡顿
public class Viewport : Singleton<Viewport>
float minX, maxX, minY, maxY;
void Start()
Camera mainCamera = Camera.main;
Vector2 bottomLeft = mainCamera.ViewportToWorldPoint(new Vector3(0f, 0f));
Vector2 topRight = mainCamera.ViewportToWorldPoint(new Vector3(1f,1f));
minX = bottomLeft.x;
minY = bottomLeft.y;
maxX = topRight.x;
maxY = topRight.y;
}
//让player调用函数限制移动
public Vector3 PlayerMoveablePoint(Vector3 playerPosition)
{
Vector3 position=Vector3.zero;
Mathf.Clamp(playerPosition.x,minX,maxX); =
Mathf.Clamp(playerPosition.y, minY, maxY); =
return position;
}
}
MainCamera Z 轴设置为 -10,但返回的两个坐标均为 0 坐标,怎么办,求大神解答。
如果摄像机 z 轴与目标距离为 10,可将 clipping planes near 参数调置 10 左右,再将这个参数带入 ViewportToWorldPoint 函数即可。
Q2.我的 Unity hub 无法进行登录,点击 sign in 没有反应
hvigor Finished :entry:default@BuildJS... after 348 ms hvigor ERROR: Failed :entry:default@CompileArkTS... hvigor ERROR: ENOENT: no such file or directory, stat 'D:\3D\tuanjie\HarmonyProject\entry\src\main\ets\workers\TuanjieMainWorkerHandler.ets.ts' COMPILE RESULT:FAIL {ERROR:1} hvigor ERROR: BUILD FAILED in 3 s 18 ms Process finished with exit code -1
官方回答:
1.3.1 支持的是 API 12,SDK5.0。请使用对应的 SDK。
Q4.团结引擎 1.3.1 的空工程在鸿蒙 5.0 模拟器崩溃
答主 溜肉段:
目前应该是不支持模拟器,建议使用真机测试。
答主 溜肉段:
官方回答:
如果打包 AB 使用的是 SBP,请将 Scriptable Build pipeline 和 Addressable package 升级到最新版本。
使用 Cloud Code C# 时,如何在 Java Web 项目中,获取 ServiceToken,用于调用 REST API 访问相应内容?
团结 MuseChat 已解答:
using Microsoft.Extensions.Logging;
using Unity.Services.CloudCode.Core;
using Unity.Services.CloudCode.Shared;
namespace ExampleModule
{
public class TokenModule
{
private static ILogger<TokenModule> _logger;
public TokenModule(ILogger<TokenModule> logger)
{
_logger = logger;
}
[ ]
public string GetServiceToken(IExecutionContext context)
{
try
{
return context.ServiceToken;
}
catch (Exception ex)
{
_logger.LogError("Failed to get service token. Error: {Error}", ex.Message);
throw new Exception($"Failed to get service token. Error: {ex.Message}");
}
}
}
}
2. 在 Java Web 项目中调用 Cloud Code API:使用上述 C# 代码获取到的 ServiceToken,可以在 Java Web 项目中调用 Cloud Code API。以下是一个 Java 示例代码,展示如何使用 ServiceToken 调用 Cloud Code API:
import java.io.IOException;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class CloudCodeClient {
private static final String CLOUD_CODE_URL = "https://cloud-code.services.api.unity.com/v1/projects/<PROJECT_ID>/modules/<MODULE_NAME>/<FUNCTION_NAME>";
private static final String SERVICE_TOKEN = "<YOUR_SERVICE_TOKEN>";
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(CLOUD_CODE_URL)
.addHeader("Authorization", "Bearer " + SERVICE_TOKEN)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
// Handle the response
System.out.println(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}
在 Java Web 项目中,替换 、 、 和 为实际的值。 运行 Java 代码,调用 Cloud Code API 并处理响应。
Q8. Addressables.LoadAssetAsync 加载不到最新 AB
已解决:出问题的 AB 包内都是 .asset 资源。经测验,热更的 .asset 在加载时都不会正常依赖到最新的 AB 包,还未去确认为什么。例子中的 CKey 为非 .asset 资源,因此加载是正常的。解决办法是通过挂载到预制上并热更预制,最后从预制上获取到最新的 .asset 资源。
Q9. 游戏第一次运行会卡顿
我的游戏安装在手机,第一次运行时怪物出现会卡顿一下,重新场景第二次就不会了。请问这怎么解决?
答主 SKODE丨程序开发:
第一次的话,加载过慢很正常,如果不能接受可以提前做个预处理的模块。
Q10. Unity 最新版 ECS 中,如何使用纯编程创建一个可以渲染的立方体?
网上和官方大量的教程基本都是通过 GameObject+Baker 烘培成 ECS 对象。那如果是针对一个纯代码生成动态场景的项目,就没有 GameObject 了,甚至预制体也没有,mesh、material 都是动态组合的,这个时候就完全没必要使用 baker 了。这个时候要怎么生成一个 entity 进行渲染呢?我看一些教程说是渲染的核心组件是 LocalTransform、RenderBounds、RenderMeshArray,我都添加上去了,但是没有渲染出来,这是为什么呀?是还缺什么其他必要的组件吗?在 Entity 层级面板中,是看到已经生成这个 entity 了,但是场景里不显示。
相关版本:
Unity6000.0.15f1c1
Entities 包 v1.2.4
Entities Graphics 包 v1.2.4
URP 项目
相关代码:
说明:组件已经确定挂载到场景里了,并且 mesh 和 material 两个属性都赋值了,并且是正确的模型和材质。
public class EcsCmpTest1 : MonoBehaviour {
using Unity.Rendering;
using Unity.Transforms;
using UnityEngine;
using Unity.Mathematics;
using Unity.Entities;
public class EcsCmpTest1 : MonoBehaviour {
public Mesh mesh;
public UnityEngine.Material material;
void Start() {
fun();
Debug.Log("end ..");
}
private void fun() {
World world = World.DefaultGameObjectInjectionWorld;
EntityManager em = world.EntityManager;
EntityArchetype archetype = em.CreateArchetype(
typeof(LocalTransform)
, typeof(LocalToWorld)
, typeof(RenderBounds)
, typeof(RenderMeshArray)
);
Entity entity = em.CreateEntity(archetype);
Debug.Log("entity.Index = " + entity.Index);
em.SetComponentData<LocalTransform>(entity, new() {
Position = new float3(0, 0, 0),
Rotation = quaternion.identity,
Scale = 1
});
em.SetComponentData<RenderBounds>(entity, new() {
Value = this.mesh.bounds.ToAABB()
});
em.SetSharedComponentManaged<RenderMeshArray>(entity, new(
new UnityEngine.Material[] { this.material },
new Mesh[] { this.mesh }
));
}
}
自己解决了,Unity 封装了一个 RenderMeshUtility.AddComponents 工具方法,用这个方法可以自动补充 entity 渲染模型需要的组件。
public Mesh mesh;
public Mesh mesh2;
public UnityEngine.Material material;
// ...
核心代码在下面的最后一行。
EntityManager entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
var entity = entityManager.CreateEntity();
// 添加Translation组件
entityManager.AddComponentData(entity, new LocalTransform {
Position = transform.position,
Rotation = quaternion.identity,
Scale = 10
});
RenderMeshArray rm = new RenderMeshArray(
new UnityEngine.Material[] { this.material },
new Mesh[] { this.mesh, this.mesh2 },
new MaterialMeshIndex[0]
);
RenderMeshDescription meshDescription = new();
// 这里可以先用默认配置
meshDescription.FilterSettings = RenderFilterSettings.Default;
// 暂时不使用光照探针
meshDescription.LightProbeUsage = UnityEngine.Rendering.LightProbeUsage.Off;
// 这里的0、1表示RenderMeshArray中mesh或material数组里数据的索引
MaterialMeshInfo materialMeshInfo = MaterialMeshInfo.FromRenderMeshArrayIndices(0, 1);
RenderMeshUtility.AddComponents(entity, entityManager, meshDescription, rm, materialMeshInfo);