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

时间:2023-02-07 21:32:18

        现在开始学习如何制作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);
}