社区问答 | 本周问答汇总 0608-0614

文摘   科技   2024-06-14 20:01   上海  

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

本期问题目录:

新手答疑:
1. 角色手持武器运动是怎么实现的?
2. 设定怪物的巡逻 索敌 以及 动画
3. Unity bug 增量 assetbundle 打包

4. 警告 CS0649:从未分配“AbstractTargetFollower.m_UpdateType”字段,并且始终具有其默认值

技术交流:
5. 亮度值动态控制

6. 如何插入素材?

新手答疑
  Q1.角色手持武器运动是怎么实现的?
角色手握武器,比如刀,剑等进行攻击的那种效果,是在建模软件里绑定好了再加载进 Unity 直接用,还是用 Unity 里通过 animation rigging 进行 IK 绑定?

团结 MuseChat 已解决

在 Unity 中实现角色手持武器进行攻击的效果通常是通过使用 Animation Rigging 中的 Inverse Kinematics(IK)来实现的。这种方法可以让角色的手部与武器保持连接,实现逼真的攻击动作。
具体步骤如下:
首先,在建模软件中完成模型的绑定,确保武器与角色模型正确绑定。
将绑定好的角色模型导入 Unity 中。
创建一个 IK 控制脚本(如 IKControl),在该脚本中设置角色的右手 IK 目标为武器的位置,并设置角色的观察位置以确保角色看向所持武器。
下面是一个示例的 IKControl 脚本,用于设置角色的 IK 目标和观察位置:
using UnityEngine;
[RequireComponent(typeof(Animator))]public class IKControl : MonoBehaviour {
protected Animator animator;
public bool ikActive = false; public Transform rightHandObj = null; public Transform lookObj = null;
void Start () { animator = GetComponent<Animator>(); }
void OnAnimatorIK() { if(animator) { if(ikActive) { if(lookObj != null) { animator.SetLookAtWeight(1); animator.SetLookAtPosition(lookObj.position); }
if(rightHandObj != null) { animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 1); animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 1); animator.SetIKPosition(AvatarIKGoal.RightHand, rightHandObj.position); animator.SetIKRotation(AvatarIKGoal.RightHand, rightHandObj.rotation); } } } }}
在 Animator Controller 中创建一个 Layer,并启用 IK Pass 选项,确保将 Animator Controller 分配给角色的 Animator 组件。
将 IKControl 脚本附加到角色模型上,并设置右手 IK 目标为武器的位置。
在播放模式下,您将看到角色的手部与武器保持连接,实现了手持武器进行攻击的效果。
通过以上步骤,您可以在 Unity 中实现角色手持武器进行攻击的效果,使动作更加逼真和流畅。
  Q2.设定怪物的巡逻 索敌 以及 动画
我想我的敌人有一个范围可以锁定玩家,当玩家出去的时候又会回到原来的范围内随机走动,锁定玩家后,怪物会向玩家走去。在这个的基础上,我希望根据怪物的朝向添加动画,分清楚左右即可。哪位大佬能帮忙解答一下?谢谢了。
答主 君莫笑:
可以了解下状态机:

https://www.cnblogs.com/Firepad-magic/p/6185201.html 

至于分清除左右可以用向量计算得知:

using UnityEngine;
public class CheckPosition : MonoBehaviour{ public Transform objectA; public Transform objectB;
void Update() { Vector3 relativePosition = objectB.position - objectA.position; float dotProduct = Vector3.Dot(relativePosition, objectA.right);
if (dotProduct > 0) { Debug.Log("Object B is on the right side of Object A"); } else if (dotProduct < 0) { Debug.Log("Object B is on the left side of Object A"); } else { Debug.Log("Object B is on the same line as Object A"); } }}
  Q3.Unity bug 增量 assetbundle 打包

首先第一次全量打包,然后将资源 C 移动到其他 ab 包中再进行增量打包。这时候增量打包出来的资源 A 包无变动,BCD 包都会有变动。这会导致加载 A 包的时候丢失 C 资源的依赖,但是如果使用全量打包,那 ABCD 包都会发生变动,A 包加载出来就会正常依赖 C 资源。有没有大佬遇到这个问题,这个问题 Unity 在哪个版本上解决的?

Unity 版本:前测试 2019.4.40f1 ,2020.3.48f1 版本均有问题, 2021.3.39f1, 2022.3.5f1c1 版本无问题;平台:Android
自答:
已找到原因 查看 Unity 版本改动修改日志和测试后,经测试 2021.3.27 有问题,2021.3.28 无问题。查看 2021.3.28 修改日志得知:
https://issuetracker.unity3d.com/issues/renaming-prefab-objects-leads-to-wrong-asset-bundle-dependency-when-the-prefab-is-nested 
应该就是这个问题。

  Q4.警告 CS0649:从未分配“AbstractTargetFollower.m_UpdateType”字段,并且始终具有其默认值

打包的时候报错:

Assets\Kawaii Slimes\Cameras\Scripts\AbstractTargetFollower.cs(17,45): warning CS0649: Field 'AbstractTargetFollower.m_UpdateType' is never assigned to, and will always have its default value 警告 CS0649:从未分配“AbstractTargetFollower.m_UpdateType”字段,并且始终具有其默认值,怎么解决啊?

答主 Peng Fan

你没有给这个 AbstractTargetFollower.m_UpdateType 赋初始值,你可以给它赋一个初始值,或者如果你能确定不需要赋初始值那就可以不用管这个 warning。
技术交流
  Q5. 亮度值动态控制

我的场景中有一个碗状模型,是由四个 obj 文件拼成,我想问下能否在代码中实现单独控制这 obj 的亮度值。

答主 Peng Fan:

可以试一下修改自发光材质的 _EmissionColor 例如:Material yourMaterial; Color yourColor; float yourIntensity; yourMaterial.SetColor("_EmissionColor", yourColor * yourIntensity);
  Q6. 如何插入素材?

答主 年少有你、橙子:

把你想导入的素材文件用鼠标摁住拖进 Project 文件夹~

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

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



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