Unity实现拾取物体的一种方法
拾取物品是游戏中常见的一个动作,实现它的方法有很多种。今天介绍的方法将用到一个简单易懂的组件——父约束(Parent Constraint)。
拾取物品是游戏中常见的一个动作,实现它的方法有很多种。今天介绍的方法将用到一个简单易懂的组件——父约束(Parent Constraint)。
可能有些小伙伴会说,拾取物品还不简单嘛?只要用Transform.SetParent就万事大吉啦~但是,Transfrom.SetParent有一个缺点:父物体的缩放比例会影响子物体。试想,如果父物体的缩放比例是2,而子物体的缩放比例是0.5,那么在改变父级的那一刻,子物体就会突然变大!这肯定不是我们想要的效果。使用Parent Constraint就可以避免这个问题,而且它还有其他一些功能,现在就让我们来试试看吧!
1. Parent Constraint组件的添加与设置
在选中游戏对象(被拾取物品)的Inspector窗口点击“Add Component”添加组件,输入Parent Constraint,就可以添加该组件,它的面板如下所示:
当用于游戏角色拾取物品时,一般开始时应取消勾选Is Active,并通过脚本控制,让角色“拿起”物体时,再将该组件激活。
Constraint Settings一栏用于调整被拾取物品的相对偏移量、偏移角度等等。当选中Lock时,这些参数将不可编辑。
如果希望你设定的约束参数影响被拾取物品的位置或坐标轴,就要勾选Freeze Position Axes和Freeze Rotation Axes的相应选项。
Source指的是影响物品位移和旋转的源物体,在我们的例子中,游戏角色要拾取一把剑,那么我们就把角色的右手作为源物体拖拽到这里。
2. 基础脚本
我们要用脚本来激活Parent Constraint组件。脚本内容非常简单,需要注意的一点是,在脚本最前面要用到UnityEngine.Animations这个命名空间。以下是我们的示例使用的脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Animations;
public class FetchItem : MonoBehaviour
{
public GameObject item;
ParentConstraint parentConstraint;
void Start()
{
parentConstraint = item.GetComponent();
if (parentConstraint == null)
{
parentConstraint = item.AddComponent();
}
}
public void Fetch()
{
parentConstraint.constraintActive = true;
}
}
3. 在动画片段中添加事件
打开拾取物品动画的Animation面板,找到角色握住剑柄的那一帧,添加事件,如图:
然后,在事件的Inspector面板中,选择刚才我们在脚本中写好的函数。
到此为止,一个拾取物品动画就做好啦,是不是很简单?
4. 扩展应用
可能已经有小伙伴注意到了,Parent Constraint组件中可以添加多个Source。也就是说,目标物体可以受多个源物体控制。我们可以通过调整不同源物体的影响权重来实现更精细的效果。比如,双手控制悬浮的魔法球,等等。欢迎大家发挥想象,回复本帖写出你的创意。
相关推荐HOT
更多>>分布式锁是什么?有什么作用?
分布式锁是一种用于在分布式系统中实现并发控制的机制。在多个节点或进程之间共享资源时,分布式锁可确保只有一个节点或进程可以访问或修改共享...详情>>
2023-06-15 11:05:38Java中switch条件语句如何使用?
在Java中,switch语句是一种条件语句,用于根据不同的条件值执行不同的代码块。switch语句的语法如下:switch(expression){casevalue1://当expr...详情>>
2023-06-06 16:24:02js获取checkbox是否选中
要检查 JavaScript 复选框是否被选中,可以使用 checked 属性。该属性返回布尔值 true 表示复选框被选中,false 表示未被选中。详情>>
2023-04-21 10:19:04linux查找文件命令
在Linux系统中,可以使用以下命令来查找文件:1.find命令:find命令可以在指定的目录下递归查找文件,可以根据文件名、类型、大小等条件来查找...详情>>
2023-03-14 13:28:14