unity之项目剖析(3)

来源:互联网 发布:淘宝卖家修改快递单号 编辑:程序博客网 时间:2024/05/22 06:35

1.4、为角色的移动添加动作

根据1.2节,渲染材质的获取可以从一张大图片中获取一部分,准备好两张图片,一张站立的图片,一张跑动的图片,如下:

 

站立图片

 

     跑动图片

创建两个材质(Material),分别添加这两张图片,使用Transparent/diffuse 的shader。

 

接着创建一个获取材质的类:AniSprite

public class AniSprite : MonoBehaviour {

private Vector2 size;//表示tiling

private Vector2 offset;

public void aniSprite (int columSize, int framePerSecond, bool moveDirection) {

//参数columnSize表示这张图片有多上个子动作,比如run就有10个。

//参数framPerSecond用于控制角色动作变更的速度,通常有多少个子动作就设置为多少

//因此run这个材质应该设置为10.

//参数moveDirection表示角色移动的方向

int index = (int)(Time.time * framePerSecond);

//只要玩家按住左右键,这个index的值就会不断地上升

index %= columSize;

//事实上,index的值只需要取0~columnSize-1就足够了

if (moveDirection) {

//moveDirection用于表示角色的移动方向

size = new Vector2 (1.0f / columSize, 1);

//这个算法根据1.2节可以很容易理解,把Tiling当做vector2

//其中x = 1.0f/columSize,  y=1,这样就可以逐步获取run的动作了。(y=1//示获取整张图片的y,下面的offset将表示对x轴的切割)

offset = new Vector2 (index * size.x, 0);

//重新解释一下Tilingoffset的作用,Tiling表示显示的范围,而offset表示//将该范围移动多少距离。(类似放大镜的作用)

}  

else {

size = new Vector2 (-1.0f / columSize, 1);

offset = new Vector2 (-index * size.x, 0);

//如果方向相反,需要加入-

}

renderer.material.mainTextureScale = size;

//该方法用于控制渲染,通常的渲染只会渲染整个材质球,如果要精确的渲染就需要//这两个方法

renderer.material.mainTextureOffset = offset;

}

}

写好这个类,在playController类中调用该类的方法就可以控制角色的移动动作了。修改之后的playController类如下:

public class PlayerController : MonoBehaviour {

public float moveSpeed; //角色移动速度

public Vector3 velocity = Vector3.zero;//角色第移动向量

AniSprite aniPlay;

private CharacterController controller;

public Material runMaterial;

public Material idleMaterial;

//添加两个材质球,用于更改角色的动作

void Start () {

aniPlay = GetComponent ("AniSprite"as AniSprite;

//获取脚本组件可以用这个方法!

controller = GetComponent<CharacterController> ();

}

void Update () {

velocity = new Vector3(Input.GetAxis("Horizontal"), 00);

if (velocity.x == 0) {

//移动向量的x0表示角色没有移动,渲染静止动作(idleMaterial

transform.renderer.material = idleMaterial;

aniPlay.aniSprite(11true);

}

if (velocity.x > 0) {

//角色向左移动,渲染移动动作

transform.renderer.material = runMaterial;

aniPlay.aniSprite (1010false);

//根据run这张图片,包含了10个子动作,因此两个参数都为10,第三个参数

//作用是决定材质渲染的方向,false为左,true为右

velocity *= moveSpeed;

}

if (velocity.x < 0) {

transform.renderer.material = runMaterial;

aniPlay.aniSprite (1010true);

velocity *= moveSpeed;

}

controller.Move (velocity * Time.deltaTime);

}

}

这样角色跑起来就有动作了而不是像之前那种漂移了,下一次将写角色的跳跃。

0 0
原创粉丝点击