【Unity3D】学习笔记(第4记) 2D游戏开发基本技巧之人物动画

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chy_xfn/article/details/40086589

        现在开始学习如何制作2d人物动画了,之前学习VC++游戏设计时知道实现2d动画是通过循环贴图的方式的,现在u3d上来实现原理差不多的,只不过用u3d会让我们少敲很多代码而已;


1 首先导入人物贴图(方法参考之前的场景制作),不同的是人物动作贴图是包含有多帧的,打开Inspector,可以看到最底下的材质图有两个参数:Tiling和offset,假如有张10帧的贴图,可以这样设置Tiling(0.1,1)【0.1表显示一帧(y是这高度上的,对于横版图可忽略它)】、offset(0.2,0)【0.2表显示第2帧】;也可以直接用代码实现:(后面制作动画会用到该方法,到时x、y用变量替换)

	renderer.material.mainTextureOffset = Vector2(0.1,0);
	renderer.material.mainTextureScale = Vector2 (0.2,1);

接下来看看完整的方法吧!可以新建一个aniSprite.js存放;

//参数类型不用声明,使用时自动创建
function aniSprite(columnSize,framesPerSecond,moveDirection)
{
	//fps为每秒刷新的帧数,
	var index:int = Time.time* framesPerSecond;//找到当前执行帧
	index =index % columnSize; //取得当前帧的索引号
	var size:Vector2;
	var offset:Vector2;
	if(moveDirection)         //类型为真或假(0或非0)
	{
		size=Vector2(1.0/columnSize,1);  //x(指Vector2的x)为一帧的长度,即显示一帧
		offset=Vector2(index * size.x,0);//index*size.x为指定某一帧
	}
	else 
	{
		size=Vector2(-1.0/columnSize,1);  //x为一帧的长度
		offset=Vector2(-index * size.x,0);//X为指定某一帧
	}

	renderer.material.mainTextureOffset = offset;
	renderer.material.mainTextureScale = size;
}

2 下面是动画控制的完整代码(实现左右移动和跳跃),按住左、右再按跳跃可有位移跳)

var jumpMaterial : Material; //跳跃贴图材质变量,需更新到Inspector,关联相应材质
var runMaterial  : Material; //跑动贴图材质变量
var idleMaterial : Material; //空闲贴图材质变量

var moveDirection : int =0;  //左0,右非0的方向变量
var walkSpeed : float  =2.0; //跑动速度
var walkJump  : float  =6.0; //跳跃高度
var g : float = 20.0;        //重力

private var controller :CharacterController;//角色控制器
private var velocity : Vector3=Vector3.zero;
private var aniPlay ;  //该变量用来调用aniSprite函数

function Start () 
{
	aniPlay = GetComponent ("aniSprite");//调用脚本
	controller=GetComponent(CharacterController);//调用
}

function Update () 
{
	if(controller.isGrounded ) //在人物地面
	{
		velocity.x=0;
		if(velocity.x==0)      //人物静止处站立状态
		{
			transform .renderer .material =idleMaterial;
			aniPlay.aniSprite(1,1,true);
		}
		if(Input.GetAxis("Horizontal")<0) //左移
		{
			transform.renderer.material=runMaterial; //指定贴图材质
			aniPlay.aniSprite(10,10,true);           //调用函数实现动画效果
			
			velocity.x =-walkSpeed;       //x值为负
			moveDirection =0;             //方向为左
		
		}
		if(Input.GetAxis("Horizontal")>0) //右移
		{
			transform.renderer.material=runMaterial;
			aniPlay.aniSprite(10,10,false);
			
			velocity.x =walkSpeed; //水平移动速度
			moveDirection =1;      //获取向右方向
		
		}
		if(Input.GetButton("Jump"))//按下跳跃键获取向上速度
		{		
			velocity.y = walkJump ;
		}
	}
	if(!controller.isGrounded )    //人物离地
	{
		if(moveDirection==0)       //向左跳
		{
			transform.renderer.material = jumpMaterial ;
			aniPlay.aniSprite(11,11,true);
		}
		else if(moveDirection==1)     //向右跳
		{
			transform.renderer.material = jumpMaterial ;
			aniPlay.aniSprite(11,11,false);
		}
	}
	velocity.y -= g * Time.deltaTime ; //重力
	//角色贴图贴在Cube上,可利用控制器控制角色(Cube)位移
	controller.Move(velocity*Time.deltaTime);
}


猜你喜欢

转载自blog.csdn.net/chy_xfn/article/details/40086589