首页 > 代码库 > unity学习笔记1012(platform)
unity学习笔记1012(platform)
前传:
今天,佳伟师兄给我们讲了第三个案例,很遗憾,第一个第二个我没能想起用博客园写,博客园自从大一暑假申请之后就再也没用过,但是真的会觉得遗憾。以后有时间,我还是会把算法一点点的攻破~这是我作为一个计算机专业学生的一个必须要做的事情。
主题:unity4.3游戏开发项目实战 第三例 platform(游戏平台)
首先说明,佳伟师兄讲的真的挺好的,无论是代码还是具体的操作,讲的很清楚。
一 游戏的策划我就不详细写了,我觉得我现在还没到能够写出策划的地步,下面我具体详写各个功能模块实现的功能。
二,模块功能:
1,level1的实现与功能分析
在做这个的过程中,我体会到的是各个场景中物体的位置的具体设置,数据可以按照自己的需求来设置。需要设置的是游戏的背景,平台,钻石,人物。
下面来说数据。你需要做的第一步是在场景中加入一个主照相机,照相机上是纵观全局的,上面设置有全局的声音,还有平行光源,其次记得要把照相机设置成2D形式,即Orthographic格式。书本上说把照相机的位置设置成z=-5,近距离可以看到-0.3,最远看到20,我们把最远设置成10就ok.(各种导入资源的我就不说了,基础了,记得在最开始的时候,保存好场景。保存好工程。)
背景的位置(0,0,9)
平台的位置(0,0,5)
照相机的位置(0,0,-1)
为了保证所发生的物体在同一个界面以发生触发,所以所有的物体必须保证在同一界面上即z=0
关于物体的世界坐标与局部坐标,我决定好好看一下,我感觉这是我的软肋。
恩恩// 问别人了 相对于一个处于世界坐标系的父物体而言,子物体在世界坐标系的位置等于子物体的坐标加上父物体的坐标//
纵观全局,我们需要给钻石,平台添加碰撞器,钻石需要加触发,以便在人物收取钻石时,产生销毁的效果,人物要加人物控制器
调节好每个物体的位置之后,我们开始写各个角色的代码
按照书本上的顺序来,我先把gem即钻石的代码整理好。gem有以下几个功能要实现:实现在一定距离范围内上下在平台上移动,其次是在人物碰撞时销毁
我们在倒入资源的时候,首先给钻石找到一个合适的位置,即定义钻石的初始位置,这个放在start函数内,毋庸置疑 startposition=transform.position.y因为钻石在上下移动,跟X轴无关。
初始化定义的钻石的速度,起始位置,和一个是否向下的bool变量
private float speed=3.0f;
private flaot startPosition;
private bool isDown=true;
接着在upstate里面写入钻石的运动模式
声明在一定的
if(isDown)
transform.Translate(speed*Time.deltaTime*Vector3.down);
else
transform.Tranlate(Vector3.up*speed*Time.deltaTime);
判断钻石的运动方向
if(startPosition-transform.positon>0.4f)
isDown=false;
if(transform.position-startPosition>0.4f)
isDown=true;
在给人物贴好标签之后,人物碰到钻石之后会销毁
void OnTriggerEnter(Collider other)
{
if(other.tag=="player")
{
Audio.Source.PlayClipAtPoint(SoundName,new Vector3(0,0,-10);//http://www.unitymanual.com/home.php?do=blog&id=141&mod=space&uid=12062详细的看这个吧,在指定位置播放剪辑。播放完成后自动消除音频源。
Detroy(gameObject);
}
}
下面来看看人物的运动 这是个大头
首先说说 人物帧的变化
先来定义
public int frameNumber=10;//书上说刚开始把人物run的帧的图片拖入到屏幕上,上次看见一个学弟说怎么自己弄一张贴图代码加入进去之后不会动,是因为资料里面的图片是美工做的一系列的动画,并不是仅仅一张贴图~~
public bool direction=true;判断人物最开始的run方向
public int lastframeNo=0;
private bool oneTime=true;这个是定义是否是一次运动过程
private int index=0;
private float frameRate=0;
private float myTime=0;定义初始值我的时间为0
private int myIndex=0;//这个是在行动的过程中帧的变化
在
接下来先写左右运动的判断
if(direction)
{
render.material.mainTextureScale=new Vector2(frameRate,1);//是贴图Uv的平铺坐标
render.material.mainTextureOffset=new Vector2(index*frameRate,0);//render.material.mainTextureOffset是贴图的偏移量
}
else
render.material.mainTextureScale=new Vecor2(-frameRate,1);
render.material.mainTextureOffset=new Vector2(index*frameRate,0);
再来看一下其余的逻辑
void update()
{
fameRate=1.0f/frameNumber;//1.0f/frameNumber 1/小图个数=每一个小图的长站大图的比例
if(oneTime)//一次开关
{
myTime+=Time.deltaTime;//时间的累加
myIndex=(int)(myTime*(frameNumber-1))//运动过程中帧的变化
index=myIndex%frameNumber;
}
if(lastFrameNo!=0)
{
if(index==lastFrameNo-1)//帧是一个数组,从0开始的,第几帧==frameNumber-1
oneTime=false;
}
}
接下来,研究一下人物游戏状态~//送给自己一句话,艰难的坚持回比轻易的放弃换回来的多很多!!
人物分为以下几种状态,采用枚举类型实现列举
public enum GameState
{
idle,
runLeft,
runRight,
jumpRight,
jumpLeft,
idleLeftJump,
idleRightJump
celebrate,
die
}
PlayerStateController的代码实现如下
在初始定义时,运动状态的设置注意不要遗漏,我自己默写试试
public Texture idle;
public Texture run;
public Texture jump;
public Texture celebrate;
publicTexture die;
public x winTexture;
public Texture2D dieTexture;
public GameState gamestate;
声音
public AudioClip soundName;
public AudioClip dieSound;
在设置几个开关
private bool moveDirection=true;
private bool exit=false;
private bool youWin=false;
private bool youDie=false;
private AnimationController myAnimation;
在Start里面获取AnimationController的组件,便于对人物的状态进行更改和利yong
void start()
{
myAnimation=GetComponent<AnimationController>();
}
在update()里面继续实现人物的动作
首先实现的是实现人物九个基本动作的逻辑
if(Input.GetAxis("Horizontal"))
{
moveDirection=false;
if(Input.GetButton("Jump"))
gameState=GameState.jumpRight;
else
gameState=GameState.runRight;
}
else if(Input.GetAxis("Horizontal")<0)
{
moveDirection=true;
if(Input.GetButton(""Jump))
gameState=GameState.jumpLeft;
else
gameState=GameState.runLeft;
}
else
if(Input.GtButton("Jump"))
{
if(moveDirection)
gameState=GameState.idleLeftJump;
else
gameState=GameState.idleRightJump;
}
else gameState=GameState.idle;
}
if(youwin)
gameState=GameState.celebarate;
if(youDie)
gameState=GameState.die;
代码逻辑易懂,但是不要遗漏人物的动作
接下来,要用switch语句写,以一个例子为例
switch(gamestate)
{
case GameState.idle:
transform.render.material.SetTexture("_MainTex",idle);
myAnimation.frameNumber=1;
myAnimation.direction=false;
break;
}
在 通过第一关的时候
if(Input.GetButton("jump")&&youWin)
{
if(Application.loadedLeveiName=="Level1")
Application.LoadLevel("level2");
else if(Application.LoadedLevelName=="level2")
Application.LoadLevel("level3");
else
Application.LoadLevel("level1");
}
if(Input.GetButton("Jump")&&youDie)
{
transform.position=new Vector3(0,-2,0);
transform.collider.enabled=true;
youDie=false;
}
IEnumberator OnTriggerEnter(Collider other)
{
if(other.tag=="exit"&&GameObject.FindWithTag("gem")==null)
{
youWin=true;
AudioSource.PlayClipAtPoint(SoundName,new Vector3(0,0,-10));
}
if(other.tag=="enemy")
{
youDie=true;
AudioSource.PlayClipAtPoint(dieSound,newVector3(0,0,-10));位置决定声音的大小
yied return new WaitForSeconds(0.5f);屏幕缓冲5秒钟
transform.collider.enabled=false;
}
}
GUI界面的设置
if(youWin)
{
GUI.DrawTexture(new Rect(Screen.width/2-1/9,Screen.height/2-90,358,180),winTexture,ScaleMode.ScaleToFit,true,0);
}
PlayController 方面
public class PlayerController : MonoBehaviour
{
public float speed = 2.0f;
private CharacterController controller;
private Vector3 velocity = Vector3.zero;
private float gravity = 20.0f;
private float jumpSpeed = 4.5f;
private GameState gameState;
private PlayerController myPlayerStateController;
// Use this for initialization
void Start ()
{
controller = GetComponent<CharacterController>();
myPlayerStateController = GetComponent<PlayerController>();
}
// Update is called once per frame
void Update ()
{
gameState = myPlayerStateController.gameState;
if (controller.isGrounded)
{
switch (gameState)
{
case GameState.runRight:
velocity = speed * (new Vector3(1, 0, 0));
break;
case GameState.runLeft:
velocity = speed * (new Vector3(-1, 0, 0));
break;
case GameState.jumpRight :
velocity = speed * new Vector3(-1, jumpSpeed, 0);
break;
case GameState .jumpLeft:
velocity = speed * new Vector3(-1, 0, 0);
break;
case GameState .idleLeftJump:
velocity = speed * new Vector3(0, jumpSpeed, 0);
break;
case GameState .idleRightJump:
velocity = speed * new Vector3(0, jumpSpeed, 0);
break;
case GameState .celebrate :
velocity = Vector3.zero;
break;
default:
velocity = Vector3.zero;
break;
}
}
else
{
velocity.y -= gravity * Time.deltaTime;
}
controller.Move(velocity * Time.deltaTime);
}
}
unity学习笔记1012(platform)