动作 如果unity3d

2018-11-15 14:42:01 qq_43667944 阅读数 3656

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

游戏中的角色动作都是怎么做的?怎么样从一个动作切换到另一个动作?

找到Unity Demo中的一个动画资源(FBX) 如下图:


把Male拖入到Scene中,调整摄像机位置。



查看Male的属性

1框 表示当前选择的默认动画,运行后播放的默认动画就是选择的 walk

2框 表示当前模型里面有5个动画,也就是这个人物有5个动作


如何切换动作?我们通过代码来控制。很简单。

新建一个Script,挂载到Male上。

using UnityEngine;using System.Collections;public class MotionControl : MonoBehaviour// Use this for initialization void Start () {  }  // Update is called once per frame void Update () {  if(Input.GetKey(KeyCode.W))  {   animation.Play("walk");  } }}

主要的函数就是

animation.Play("walk");

参数就是动作的名字,在属性栏就可以看到。


按下 W 键,主角就从默认动画切换到了 Walk 动画。


           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述
2018-08-14 10:37:38 xuelanlingying 阅读数 3754

Unity3D笔记——数据驱动模型之bvh动作数据驱动3D模型跳舞

话说这个方面的东西真是要命啊。。。最大的问题是。。。不会用unity3d。。。。

实际上,bvh是不能直接在unity3D里面使用,需要转成bvh。怎么转呢?这个就需要 MotionBuilder 这个软件,步骤如下:
1、打开MotionBuilder,新建一个项目
2、点击菜单 File->Motion File Import… 选择bvh文件导入
3、点击菜单 File->Save As 保存为fbx文件
ok,这样就完成了 bvh转fbx

下面在unity3D里面使用这个fbx文件
1、打开unity3d,新建一个项目(我的unity是2018版的)
2、在 Asset Store中找一个3D人体模型,我用的是这个
这里写图片描述
点击导入
会出现一个弹出框,点击 import
这里写图片描述
3、导入完成后,界面下栏的 project中,Assets下会多出导入的模型的包,点开,找到 models 文件夹 双击打开,把里面的模型拖到左上栏这里写图片描述
4、建立一个文件夹(最好英文),里面放着要用的fbx文件,将文件夹拖入 Assets里
这里写图片描述

重点来了!!!

5、点击导入的文件夹,打开后,在下栏的空白区域创建一个控制器,右键->Create->Animator Controller,随便取个名字
这里写图片描述
6、点击Asset store右边的animator标签页,点开fbx文件图标上的小三角,将第二个 动作文件 拖到标签页里
这里写图片描述
entry会自动连接上拖入的图标,然后在拖入的图标上右键->Make Transition,点击exit,又会生成一条白线把图标和exit按钮连起来
这里写图片描述

7、点击左上栏之前拖入的模型,在右侧会打开一个inspector标签页,把刚刚创建的controller拖到标签页里的controller里
这里写图片描述

8、点击fbx里面第二个文件,在右侧属性栏 点击 edit
这里写图片描述

选择Rig标签,Animation Type选择humanoid!别忘记点击 apply
这里写图片描述

9、打开Scene 点击最上面的三角,就可以看见模型动起来啦~~

2017-09-06 11:36:34 aa20274270 阅读数 3788

1. 那到一个T Post的 模型,FBX,Obj都可以。

2. www.mixamo.com 网站十分强大,可以自动给模型绑骨骼,上传模型到网站,自动绑骨骼,也可以选择动作,下载帮好骨骼的模型。

3. 导入绑好骨骼的Fbx,导入到Unity中,选择 Rig为 Humanoid, 就可以用 www.mixamo.com 网站 上的所有的动作。

总结,如果想公用动作,就把需要公用动作的模型都上传到  www.mixamo.com 网站,自动绑好骨骼,设置好 Rig为 Humanoid,那么一个动作就可以用多个模型使用。

2014-06-12 00:40:21 qp120291570 阅读数 13956

提要

今天要实现的是一个简单人物控制器。包括用w,a,s,d来控制人物上下左右跑动,鼠标左击发出连招,都是基于老的lagacy的动画。虽然unity3d自带有charactorcontroller,但是并不是很好用,所以人物控制相关的全部自己来实现。先上效果图:



场景搭建

首先下载这个package,里面包含了人物的动作还有地面的模型。将人物和地面都拖进场景中。这里的模型默认的动画模式是lagacy,不用修改。模型有点偏小,改变模型的scale值为10.最好不要改源文件的scale的scale factor,可能会出现骨骼错位的问题。



接下来给摄像机添加一个天空盒组件,添加一个unity自带的天空盒就好。

对于人物还要添加几个component:


添加Rigdbody来控制人物,选择IsKinematic,这样角色就不会被外力影响。加了CapsuleCollider让角色 不掉下去。HeroController用来控制角色的运动和打斗,下面会说。


角色行走

思路很简单,通过wasd获得行走的方向,然后对应控制角色的位移就可以了,不过在变向的时候要注意角色的平滑转身。

首先定义 一个 枚举变量,为角色可能的状态。

	public enum ActionState
	{
		Attack_1,
		Attack_2,
		Attack_3_1,
		Attack_3_2,
		Attack_3_3,
		Attack_4,
		Fire,
		Jump,
		Run,
		Idle
	}
	private ActionState actionState = ActionState.Idle;

Animate函数来根据角色的状态播放对应的动画

	void Animate()
	{
		float delayTime = -0.1f;

		switch (actionState) {
		case ActionState.Attack_3_1:
			delayTime = -0.1f;
			playerAnimation.CrossFade("Attack3-1", 0.15f);
			currentAnimationClip = playerAnimation["Attack3-1"].clip;
			break;
		case ActionState.Attack_3_2:
			delayTime = -0.1f;
			playerAnimation.CrossFade("Attack3-2", 0.15f);
			currentAnimationClip = playerAnimation["Attack3-2"].clip;
			break;
		case ActionState.Attack_3_3:
			delayTime = -0.1f;
			playerAnimation.CrossFade("Attack3-3", 0.15f);
			currentAnimationClip = playerAnimation["Attack3-3"].clip;
			break;
		case ActionState.Attack_4:
			delayTime = -0.1f;
			playerAnimation.CrossFade("Attack4", 0.15f);
			currentAnimationClip = playerAnimation["Attack4"].clip;
			break;
		case ActionState.Idle:
			playerAnimation.CrossFade("Idle", 0.35f);
			currentAnimationClip = playerAnimation["Idle"].clip;
			break;
		case ActionState.Jump:
			playerAnimation.CrossFade("Jump", 0.15f);
			currentAnimationClip = playerAnimation["Jump"].clip;
			break;
		case ActionState.Run:
			playerAnimation.CrossFade("Run", 0.15f);
			currentAnimationClip = playerAnimation["Run"].clip;
			break;
		case ActionState.Fire:
			playerAnimation.CrossFade("Fire", 0.15f);
			currentAnimationClip = playerAnimation["Fire"].clip;
			break;
		default: break;
		}
		//Switch to default if an animation is almost over
		if (playerAnimation[currentAnimationClip.name].time > (playerAnimation[currentAnimationClip.name].length + delayTime)){
			actionState = ActionState.Idle;
			currentAnimationClip = playerAnimation["Idle"].clip;
		}
	}

在update函数中添加对应的逻辑函数:

	// Update is called once per frame
	void Update () {

		float h = Input.GetAxis("Horizontal");  
		float v = Input.GetAxis("Vertical");  
		MovementManagement (h, v);
		Animate ();
	}

MovementManagement函数就是根据输入处理角色行走的

	void MovementManagement(float horizontal, float vertical)
	{
		if(horizontal != 0f || vertical != 0f)
		{
			Rotating(horizontal, vertical);
			actionState = ActionState.Run;
			moveDirection = new Vector3(horizontal, 0.0f, vertical);
			rigidbody.MovePosition(rigidbody.position + speed * moveDirection * Time.deltaTime);
		}
	}

平滑转身函数(参考Unity官网的toturial)

void Rotating(float horizontal, float vertival)
	{
		Vector3 targetDirection = new Vector3 (horizontal, 0f, vertival);
		// Create a rotation based on this new vector assuming that up is the global y axis.
		Quaternion targetRotation = Quaternion.LookRotation(targetDirection, Vector3.up);
		
		// Create a rotation that is an increment closer to the target rotation from the player's rotation.
		Quaternion newRotation = Quaternion.Lerp(rigidbody.rotation, targetRotation, turnSmoothing * Time.deltaTime);
		
		// Change the players rotation to this new rotation.
		rigidbody.MoveRotation(newRotation);
	}

由于这里是简单的平地,所以处理起来比较简单。当需要控制角色在复杂的地形上行走的时候,比如山川丘陵,就需要角色在Y方变化了。这个时候只需要勾选角色的rigidbody component的 use gravity,然后限制rigidbody的x,z方向的移动了,x,z方向的移动要完全靠脚本来处理。


角色连击

首先来思考一下逻辑。角色初始值状态是Idle,此时按下攻击,发连招的第一招,如果玩家继续按的话就进入第二招,依次类推,如果中途停下的话,就还是回到Idle状态。这是最简单的单线连招的逻辑,没有考虑打断,多连等情况,代码实现如下:

	void AttackLogic()
	{
		if (Input.GetButtonDown ("Fire1")) 
		{
			if(actionState != ActionState.Attack_3_1 && actionState != ActionState.Attack_3_2
			   && actionState != ActionState.Attack_3_3&& actionState != ActionState.Attack_4)
			{
				Debug.Log ("Fire");
				actionState = ActionState.Attack_3_1;
			}
			else if(actionState == ActionState.Attack_3_1 && playerAnimation[currentAnimationClip.name].time > 1.0f)
			{
				actionState = ActionState.Attack_3_2;
			}
			else if(actionState == ActionState.Attack_3_2 && playerAnimation[currentAnimationClip.name].time > 1.0f)
			{
				actionState = ActionState.Attack_3_3;
			}
			else if(actionState == ActionState.Attack_3_3 && playerAnimation[currentAnimationClip.name].time > 1.0f)
			{
				actionState = ActionState.Attack_4;
			}
			/*else if(actionState == ActionState.Attack_3 && playerAnimation[currentAnimationClip.name].time > 2.0f)
			{
				actionState = ActionState.Idle;
			}*/
				
		}
		else if(Input.GetButtonDown ("Jump"))
		{
			actionState = ActionState.Jump;
		}
		else if(Input.GetButtonDown ("Fire2"))
		{
			actionState = ActionState.Fire;
			
			//if (currentSkill==null)
		}

	}


运行一下,就可以实现最开始的那个效果了。


参考

Unity3d toturial - Stealth

2017-06-10 21:18:50 yongh701 阅读数 57168

FBX的使用与Animation设置是一个很有必要的技能,对于美工MM送过来的3D模型你应该懂得如何将其设置到游戏场景之中使用,不然真的羞死人的,这都不会。毕竟游戏里面许许多多的主角的动作都是一系列已经做好的3D动画,包括行走、攻击动作等,很少人在update()中来写一大堆来实现的。下面列举两个例子,说明FBX的使用与Animation设置,说白了,就是3D模型如何在Unity3D中使用。

文中所用到的两个3D模型:

Ezreal:http://download.csdn.net/detail/yongh701/9866792

Alice:http://download.csdn.net/detail/yongh701/9866791

一、材质贴图已打包为DDS、动画需要切割的FBX

1、导入

Ezreal是一个材质贴图已打包为DDS的FBX,其文件结构如下图所示:


那么在Unity3D中直接导入这个FBX文件即可。


导入之后如下图所示,可以看到Unity3D能够自动识别此类3D模型,同时,还能识别到3D模型中带有的动画,并且整个FBX模型所带的动画我们还能做个大致的预览,一般情况下,Take 001就是模型最初的动作。


这个模型被导入到Unity3D就是一个预设Prefab存在,你可以随意拖放,关于什么是预设Prefab,在《【Unity3D】利用预设、实例化Instantiate和协程完成生成器》(点击打开链接)我已经提到过了,这里不再赘述了。我们可以直接将这个Ezreal拖入场景当中,并且在(0,5,-10)拖一个Directional light,给模型提供合理的光照,大家可以看到3D模型已经基本能够使用了。


2、动画切割

但这样还不行,我们刚才明明看到这个FBX模型是带有动画Take 001,而且Take 001里面带有3个动作的,一个是模型在静止时发呆的动作、一个是行走动作、一个是攻击的动作。我们需要将这样动作应用到模型上面来。

首先,我们要在FBX模型的控制面板,设置Rig中的Animation Type为Legacy,Generation按默认就行,然后点击Apply将动画应用到这个模型上。在Unity3D一般使用Legacy动画。


之后,我们需要对动画进行切割。打开Animation面板,添加三个片段,分别是idle发呆、run跑步、attack攻击,然后分别修改好名字。同时设置好其在Take 001的开始帧与结束帧,设置开始、结束帧的时候,可以边播放动画,边调试。一般美工MM也会告诉你,她设置的各段具体的开始结束帧,这里Ezreal的三段分别为0-39、40-65、66-96。同时对于idle与run的循环模式都从Once改成Loop,因为这是一个长期存在的行为。之后点击Apply,则可以看到Take 001被切割成我们要求的三段。


3、动画处理

之后我们则可以对这个模型附着如下的脚本AnimationScript.cs:

using UnityEngine;
using System.Collections;

public class AnimationScript : MonoBehaviour
{
    void Start()
    {
        Animation animation = this.animation;//动画控制器
        animation.Play("idle");//上来直接播放idle动画
    }
    void OnGUI()
    {
        if (GUI.Button(new Rect(0, 0, 100, 30), "行走"))
        {
            animation.Play("run");
        }
        if (GUI.Button(new Rect(100, 0, 100, 30), "停止"))
        {
            animation.Play("idle");
        }
        if (GUI.Button(new Rect(200, 0, 100, 30), "攻击"))
        {
            animation.Play("attack");
            animation.PlayQueued("idle");//播放完attack之后再播放idle
        }
    }
}

可以看到脚本很短,甚至大家看代码都能直接知道意思,运行结果如下:


可以看到基本能够达到一个比较不错的水平了,如果你能有个做fbx模型做得很好的MM,和她配合下,其实基本实现很多东西了……当然现实中哪有这么浪漫?基本上要么自己一手包,要么就到外面的三维公司里面买,或者小成本点的,就自己收集些免费的fbx素材……

上面的动画可以看到行走run这个动画,循环之间的分P还有点小跳跃,这个要么就是没切割好,要么就是动画本身问题,在整个动画,三个动作之间,留得空隙过短,导致不好分割,很遗憾,我这里是后者……毕竟这个素材我也是在网上收集的……


这里说完一大类的FBX,下面说另一大类的FBX


二、材质贴图没打包、动画不需要切割的FBX

1、导入

alice是一个材质贴图没打包好的fbx模型,文件模型如下图所示:


那么我们需要在Unity3D的Assets根目录新建一个Textures文件夹,不可改名,就叫这个名字,不为什么。通过Import New Asset...一个一个将材质贴图导入,Import New Asset..貌似不支持多选的,所以只能一个一个导入。所以为了减少鼠标点击次数,请让你的美工MM,打包材质吧!那些做工精致的模型,估计材质贴图要上万。


之后,我们才在Assets根目录导入这个FBX模型,一定要遵守这个顺序,不然导入的模型会丢失材质的。

同样可以将个模型拖拽出来,沿Y轴旋转180度,也就是Rotation设置Y为180,并且与上面模型一样,在(0,5,-10)拖一个Directional light,给模型提供合理的光照。在Rig的动画同样设置为Legacy并且应用到模型。


2、由于这个模型只有一个无须切割的动画,因此可以直接附着如下脚本AnimationScript2.cs:

using UnityEngine;
using System.Collections;

public class AnimationScript2 : MonoBehaviour
{
    void Start()
    {
        Animation animation = this.animation;
        animation.Stop();//由于只有一条动画,无须切割,Unity3D默认将会直接播放这个动画的
    }
    void OnGUI()
    {
        if (GUI.Button(new Rect(0, 0, 100, 30), "行走"))
        {
            animation.Play();
        }
        if (GUI.Button(new Rect(100, 0, 100, 30), "重新行走"))
        {
            animation.Rewind();
        }
        if (GUI.Button(new Rect(200, 0, 100, 30), "停止"))
        {
            animation["Take 001"].normalizedTime = 0;//定位到此动画的第0帧
            animation.Sample();//跳转
            animation.Stop();//再停止
        }
    }
}
这里基本已经完全展示如何使用Animation类的基本方法来控制动画了,其中这里唯一需要注意的一点,animation.Stop();单单是暂停动画,如果你想将动画调回第一帧再播放,需要如上的来使用Animation类的基本方法。

运行效果如下所示:



估计这两大例子基本已经能让大家明白Unity3D中3D模型的使用。

Unity3D常见面试题

阅读数 39835