Unity 2D Animation——3.待机动画录制

Unity 2D Animation——3.待机动画录制,第1张

上一回我们介绍了 Unity中的2D IK系统 ,这一回我们讲讲如何录制第一个动画——待机动画。

首先打开Unity动画窗口,点击Window——》Animation——》Animation。可以看到下方的时间轴,跟大部分动画制作软件一样,Unity也有一条时间轴。注意这里的Animation窗口和Animator窗口,不要混淆。Animation是制作动画剪辑用的,而Animator是设置动画状态机用的。

创建动画剪辑的时候一定要清楚目前选中的节点,本例中选择的是Player节点,最外层节点。在这个节点上创建Animation,用于控制全身的动作。同时要确保下子节点中没有创建Animation组件。

在d出的对话框中给新创建的动画剪辑命名,待机动画命名为idle_animation。创建Animations目录,保存于Animations目录中,养成分目录的好习惯,便于资产的管理。

录制动画之前,需要将角色中需要录制动画的所有节点的position,rotation全部设置添加到关键帧中。在Hierarchy层级窗口中,我们选择如下图所示的节点,注意选择之前可以按住alt键并点击MBoy左侧的小三角,就可以打开MBoy下所有的子节点。选中第一个节点后按住shift键,再选中最后一个节点就可以全部选中,再按住ctrl键来剔除不需要的节点。其中骨骼端点的空节点都是不需要的,不需要通过这几个点来控制IK点的运动。但是最下方的几个Target必须得加入进去,这几个点是控制IK运动的目标点。

选中节点之后,在Animation窗口中点击录制关键帧按钮,进入录制关键帧模式。

在Inspector检视窗口中找到Position属性,在上面右键单击,d出菜单中选择添加关键帧Add Key,将上一步中选中的所有节点的Position属性全部添加到关键帧中。重复上述步骤将Rotation属性也添加关键帧Add Key。

添加完关键帧后,Potision和Rotation属性分别如图所示。

复制第0帧的所有关键帧,粘贴到第60帧上。点击最上面的菱形即可选中下面所有的关键帧。按ctrl+c进行复制,在第60帧上按ctrl+v进行粘贴。保证第0帧的关键帧与第60帧的关键帧一致,完成了一个60帧的循环。

在第30帧处,选中根骨骼进行向下移动,可以看到时间轴上已经记录了当前的动作,加入了新的关键帧。左右拖动时间轴可以看到动画效果。(unity2019和2021点击动画播放按钮可以正常看到动画,2020点击动画播放按钮看不到动画效果,不知道是不是unity的bug,直接运行项目倒是正常的。)

播放动画查看动画效果,可以反复优化动作。

参考

Unity3d 之 理解Gameobject ,gameObject,Transform,transform的区别和关联

GameObjectFind与TransformFind的区别

Unity3D游戏开发GameObjectFind()、TransformFind查找隐藏对象 (十)

两者返回的类型是不同的:

把这个脚本挂在testfind节点上,指定testName为a或b时,可以找到。而指定为aa或bb时,结果是没找到。此时可以传路径进去,指定为a/aa时,发现又可以找到了。 这就说明了 transformFind不会递归查找。

在实际开发中可能遇到这样的情况,给定一个节点,在这个子节点中递归的查找符合条件的节点。transformFind不能递归查找,不能直接使用,GameObjectFind又做了很多无用功,关键若是重名还不一定能满足需求。于是我们可以自己写一个递归程序:

参考 unity3d 提高thistransform的效率

正常来说,大部分同学一般get transform都直接gameobjecttransform使用。但往往,你会发现有些人会将transform引用保存起来,例如:

然后使用myTransform替代thistransform。如果你不知道u3d内部实现获取方式你肯定会以为这人脑抽水了,有直接的不用,还自己保存起来。

在Visual Studio中按F12进入定义可以看到,这些属性都是getter。我们的每一次调用,Unity内部会从GameObject里搜寻这些Component,会有一定的损耗。估计大概的效率(没测试,以后有时间再弄,大家可以参考下文章最后的链接):

实际上如果你是偶尔调用一下transform的话,那就不要保留它的引用了,直接thistransform。 如果是Update中,每一帧都要改变的话,还是保留一下thistransform的引用吧。 毕竟倘若一大堆东西的话,能快不少呢。

通过Hierarchy面板下的Create菜单可以手动地创建一个GameObject,它可以是一个相机,一个灯光,或者一个简单的模型,当我们要在程序里面动态地创建一个相机的时候,可以new一个GameObject,然后把Camera组件Add给它就可以了,创建灯光,GUI等也类似,但要创建简单模型的时候,我发现并没有类似Cube,Sphere这样的组件可供添加,后面知道,通过GameObject这个类的一个静态方法可以达到这个目的staticGameObjectCreatePrimitive(PrimitiveTypetype);可以根据PrimitiveType创建五种类型的基础模型PrimitiveTypePlane,PrimitiveTypeCube,PrimitiveTypeSphere,PrimitiveTypeCapsule,PrimitiveTypeCylinderUnity3D提供一种被称为Prefab的预置对象,它是以文件的形式保存在硬盘上的一个GameObject,它里面可能包含了各种设置,组件,还有一些脚本。Prefab允许我们在不同的Scene,甚至Project中使用同一个对象,例如我实现了一个子d,通过打包成Prefab,我可以在另外一个游戏里面直接使用它。当一个Prefab对象被修改的时候,它的所有实例都会相应地被修改在代码里面动态地实例化一个Prefab对象publicGameObjectobj;obj=Instantiate(obj);要先创建一个公有变量,然后把这个Prefab拖到这个变量上,然后才可以用它来实例化对象(我感到一种蛋蛋的忧伤,能不拖吗)通过Resources这个类的静态方法可以将Prefab对象动态加载进来,创建GameObjectGameObject之间的通讯,在游戏中,我们往往需要知道其他对象的一些信息,所以我们经常需要动态地查询另外一个GameObject1查找父节点transformparent2查找子节点transformFind("name");transformFind("Arm/Hand/Finger");没有找到会返回null,名字如果包含"/"字符将像路径一样穿越层次3查找场景中的其他GameObjectGameObjectFind从Scene下开始查找,根据GameObject的名字进行查找,允许使用"/"穿越层次查找,GameObjectFindWithTag根据Tag查找一个GameObject,GameObjectFindGameObjectsWithTag根据Tag批量查找GameObjectGameObject的name和Tag可以直接设置,但Tag需要在标签管理器先定义一个Tag,这个Tag才可用,你不能将一个未定义的Tag赋给GameObject的Tag变量最后还有一种搓搓的通讯方法,通过Message来调用其他GameObject,默认是垃圾短信群发,也可以将一个Object穿进去,然后调它的方法methodName为方法名,value为方法的参数,options表示是否必须有对象接收该消息(如果是,且没有对象接受,u3d报错)//调用本级别所有的GameObject上所有脚本的methodName方法voidSendMessage(stringmethodName,objectvalue=null,SendMessageOptionsoptions=SendMessageOptionsRequireReceiver);//朝本级别和上级父节点发送调用命令voidSendMessageUpwards()//目标是本级别和全部子节点voidBroadcastMessage()调用Object的Destroy方法可以销毁一个GameObject,组件,或者资源。这是一个静态方法,函数的原型为staticvoidDestroy(Objectobj,floatt=00F);可以通过将this传入,销毁自己。GameObject的成员变量很多

1private Rigidbody a;

2aisKinematic=false ;

Unity 是基于GNOME桌面环境的用户界面, 由Canonical公司开发,主要用于Ubuntu *** 作系统。

Unity作为Compiz的插件,是使用C++和Vala编程语言实现的,并使用了不常用的Nux的OpenGL工具包。

作为Compiz的一个插件,Unity的GPU加速性能可以广泛支持不同的硬件体系。

static GameObject CreatePrimitive(PrimitiveType type);

可以根据PrimitiveType创建五种类型的基础模型

PrimitiveTypePlane,PrimitiveTypeCube,PrimitiveTypeSphere,PrimitiveTypeCapsule,PrimitiveTypeCylinder

Unity3D提供一种被称为Prefab的预置对象,它是以文件的形式保存在硬盘上的一个GameObject,它里面可能包含了各种设置,组件,还有一些脚本。Prefab允许我们在不同的Scene,甚至Project中使用同一个对象,例如我实现了一个子d,通过打包成Prefab,我可以在另外一个游戏里面直接使用它。

当一个Prefab对象被修改的时候,它的所有实例都会相应地被修改

在代码里面动态地实例化一个Prefab对象

public GameObject obj;

obj = Instantiate( obj );

要先创建一个公有变量,然后把这个Prefab拖到这个变量上,然后才可以用它来实例化对象(我感到一种蛋蛋的忧伤,能不拖吗)

通过Resources这个类的静态方法可以将Prefab对象动态加载进来,创建GameObject

GameObject之间的通讯,在游戏中,我们往往需要知道其他对象的一些信息,所以我们经常需要动态地查询另外一个GameObject

1 查找父节点 transformparent

2 查找子节点 transformFind("name"); transformFind("Arm/Hand/Finger"); 没有找到会返回null,名字如果包含"/"字符将像路径一样穿越层次

3 查找场景中的其他GameObject

GameObjectFind 从Scene下开始查找,根据GameObject的名字进行查找,允许使用"/"穿越层次查找,

GameObjectFindWithTag根据Tag查找一个GameObject,

GameObjectFindGameObjectsWithTag 根据Tag批量查找GameObject

GameObject的name和Tag可以直接设置,但Tag需要在标签管理器先定义一个Tag,这个Tag才可用,你不能将一个未定义的Tag赋给GameObject的Tag变量

最后还有一种搓搓的通讯方法,通过Message来调用其他GameObject,默认是垃圾短信群发,也可以将一个Object穿进去,然后调它的方法

methodName为方法名,value为方法的参数,options表示是否必须有对象接收该消息(如果是,且没有对象接受,u3d报错)

//调用本级别所有的GameObject上所有脚本的methodName方法

void SendMessage(string methodName, object value = null, SendMessageOptions options = SendMessageOptionsRequireReceiver);

//朝本级别和上级父节点发送调用命令

void SendMessageUpwards()

//目标是本级别和全部子节点

void BroadcastMessage()

调用Object的Destroy方法可以销毁一个GameObject,组件,或者资源。这是一个静态方法,函数的原型为 static void Destroy(Object obj, float t = 00F );

可以通过将this传入,销毁自己。

GameObject的成员变量很多

public GraphicRaycaster m_CanvasUI; public EventSystem eventSystem; private void Update()

{ if (InputGetMouseButtonDown(0)) {

CheckSecondUI(InputmousePosition);

}

} /// <summary>

/// 检测是否有第二层UI

/// </summary>

/// <returns></returns>

public void CheckSecondUI(Vector2 pos)

{

List<GameObject> objList = new List<GameObject>();

PointerEventData eventData = new PointerEventData(eventSystem);

eventDatapressPosition = pos;

eventDataposition = pos;

List<RaycastResult> list = new List<RaycastResult>();

CanvasUIRaycast(eventData, list); if (listCount > 0)

{ for (int i = 0; i < listCount; i++)

{

DebugLog(list[i]gameObjectname);

}

} else {

DebugLog("没有UI");

}

}12345678910111213141516171819202122232425262728293031323334

当鼠标在屏幕上点击时,会打印出鼠标下所有的UI物体的名称

昨天中国AR网 (>

今天我们继续教程的分享《Unity教程:Unity地形编辑器》

地形:

地形创建:创建地形 :GameObject->3D Object->Terrain

编辑地形:

地形资源导入方法:

点击鼠标右键,然后依次点击: Import Package -> Terrain Assets->Import

地形细节设置:

为地形放置树木

创建风力区域:

GameObject ->3D Object->Wind Zone

为地形放置花草

为地形添加细节模型:

第三方插件:花草与模型地形编辑相关设置:设置地形长、宽、最高海拔、分辨率以及最大树木放置量。

地形编辑相关设置:提高海平面添加水体,天空盒,太阳光等资源导入:水体、天空盒、太阳光和角色控制器在Project 窗口中,鼠标右键选择 Import Package,如右图所示, 导入内置的资源包。树木创建器(Tree Creator)树木创建器面板在菜单中的GameObject->3D Object->Tree, 创建一棵树。在场景中选择Tree,在Inspector窗口中显示出Tree Creator 面板

。一般树木的制作步骤:1:> 基本树干形状建立:选择根建立分枝干设置分支干Distribution 为 Whorled。 设置 Frequency 为 30。2:> 提高主枝干开始长出分枝干的高度:选择分枝干节点,打开Distribution 属性的曲线编辑器,设置曲线。3:> 使得分枝干向上生长:选择分枝干节点,调节Growth Angle 的值为06一般树木的制作步骤(续)4:> 添加“子枝干”选择分枝干 (再)添加分枝干 选择长度变短。5:> 为枝杈添加树叶。6:> 修改树叶大小。7:> 添加树皮材质。分别选择主树干、分树干、子树干的属性 Branch Material 添加准备好的材质。8:> 添加树叶材质。树木创建器树木创建器-面板

教程由中国AR网资源教程(>

以上就是关于Unity 2D Animation——3.待机动画录制全部的内容,包括:Unity 2D Animation——3.待机动画录制、Unity Gameobject Transform、图解unity下gameobject和transform的区别和关联等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9830593.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存