飞机大战笔记
2015-07-05 19:30
351 查看
一、建立滚动场景和主战机动画;
两个脚本;
场景动画:
住战机的帧动画:
二、主战机发射子弹,敌机以及奖励的随机生成
hero上空子类,也就是3个炮口Gun类:
发射的时间间隔,发射的对象的控制:
子弹类:移动加消失
敌机的移动血量,速度,得分,以及出镜头后消失方法:
奖励类:
奖励的移动速度,奖励的类型,以及奖励出境消失方法:
产卵类:
也就是随机生成3种敌机和2种奖励。x轴用到随机数:
三、设置主角的控制和敌机的动画
显示设置子弹和敌机的碰撞检测
然后给敌机设置好两种动画的播放。
子弹:
两个脚本;
场景动画:
using UnityEngine; using System.Collections; public class BackgroundTransform : MonoBehaviour { public float moveSpeed = 2f; // Update is called once per frame void Update () { this.transform.Translate( Vector3.down * moveSpeed * Time.deltaTime ); Vector3 postion = this.transform.position; if(postion.y<=-8.52f){ this.transform.position = new Vector3(postion.x,postion.y+8.52f*2,postion.z ); } } }
住战机的帧动画:
using UnityEngine; using System.Collections; public class Hero : MonoBehaviour { public bool animation = true; //bool变量标示是否在动画 public int frameCountPersconds = 10;//每秒播放10帧,一个动画两帧,相当于5遍动画。 public float timer = 0; //计时器 public Sprite[] sprites;//通过数组设置动画 private SpriteRenderer spriteRender; void Start(){ spriteRender = this.GetComponent<SpriteRenderer> (); //这样初始化避免每次调用费时 } // Update is called once per frame void Update () { if (animation) { timer += Time.deltaTime;//计算出一帧需要时时间1/10 1f/frameCountPersconds int frameIndex = (int) ( timer / (1f / frameCountPersconds) ); int frame = frameIndex % 2;//计算出当前帧 /***/ spriteRender.sprite = sprites [frame]; //得到SpriteRenderer组件,并把当前帧赋给sprite属性 } } }
二、主战机发射子弹,敌机以及奖励的随机生成
hero上空子类,也就是3个炮口Gun类:
发射的时间间隔,发射的对象的控制:
using UnityEngine; using System.Collections; public class Gun : MonoBehaviour { public float rate = 0.2f;//每隔0.2秒发一颗子弹 public GameObject bullet;//表示子弹的预制对象(frifab) void Start(){ openFire (); } //新建一个方法 public void fire(){ GameObject.Instantiate (bullet, transform.position, Quaternion.identity); //GameObject里面的实例化方法(变量,位置,旋转角度) //Quaternion.identity代表没有旋转的一个静态变量 } public void openFire(){ InvokeRepeating("fire",1,rate); //InvokeRepeating方法(调用的方法的名字,过多长开始时间调用,每间隔多少秒调用一次 ) //InvokeRepeating(string methodName,float time, float repeatRate ) } }
子弹类:移动加消失
using UnityEngine; using System.Collections; public class Bullet : MonoBehaviour { public float speed = 2; void Update(){ transform.Translate ( Vector3.up * speed * Time.deltaTime ); if (transform.position.y > 4.3f) { Destroy(this.gameObject); } } }敌机类:
敌机的移动血量,速度,得分,以及出镜头后消失方法:
using UnityEngine; using System.Collections; public class Enemy : MonoBehaviour { public int hp=1; public float speed = 2; public float score = 100; // Use this for initialization void Start () { } // Update is called once per frame void Update () { this.transform.Translate ( Vector3.down*speed*Time.deltaTime ); if (this.transform.position.y <= -5.6) { Destroy(this.gameObject); } } }
奖励类:
奖励的移动速度,奖励的类型,以及奖励出境消失方法:
using UnityEngine; using System.Collections; public class Award : MonoBehaviour { public int type = 0;// 0 gun 1 explode public float speed = 1.5f; void Update(){ this.transform.Translate (Vector3.down * Time.deltaTime * speed); if (this.transform.position.y <= -4.5) Destroy (this.gameObject); } }
产卵类:
也就是随机生成3种敌机和2种奖励。x轴用到随机数:
<pre name="code" class="csharp">using UnityEngine; using System.Collections; public class Spawn : MonoBehaviour { public GameObject enemy0Prefab; public GameObject enemy1Prefab; public GameObject enemy2Prefab; public GameObject awardType0Prefab; public GameObject awardType1Prefab; public float enemy0Rate = 0.5f;//敌机生成速率 public float enemy1Rate = 5f;//敌机生成速率 public float enemy2Rate = 8f;//敌机生成速率 public float awardType0Rate = 7;//奖励生成速率 public float awardType1Rate = 10;//奖励生成速率 // Use this for initialization void Start () { InvokeRepeating ("cteareEnemy0",1,enemy0Rate); InvokeRepeating ("cteareEnemy1",3,enemy1Rate); InvokeRepeating ("cteareEnemy2",6,enemy2Rate); InvokeRepeating ("cteareAwardType0",10,awardType0Rate); InvokeRepeating ("cteareAwardType1",10,awardType1Rates); } // Update is called once per frame void Update () { } public void cteareEnemy0(){ float x = Random.Range (-2.15f, 2.15f); GameObject.Instantiate (enemy0Prefab,new Vector3(x,transform.position.y,0), Quaternion.identity); } public void cteareEnemy1(){ float x = Random.Range (-2.04f, 2.04f); GameObject.Instantiate (enemy1Prefab,new Vector3(x,transform.position.y,0), Quaternion.identity); } public void cteareEnemy2(){ float x = Random.Range (-1.57f, 1.57f); GameObject.Instantiate (enemy2Prefab,new Vector3(x,transform.position.y,0), Quaternion.identity); } public void cteareAwardType0(){ float x = Random.Range (-2.1f, 2.1f); GameObject.Instantiate (awardType0Prefab,new Vector3(x,transform.position.y,0), Quaternion.identity); } public void cteareAwardType1(){ float x = Random.Range (-2.1f, 2.1f); GameObject.Instantiate (awardType1Prefab,new Vector3(x,transform.position.y,0), Quaternion.identity); } }
三、设置主角的控制和敌机的动画
显示设置子弹和敌机的碰撞检测
然后给敌机设置好两种动画的播放。
子弹:
using UnityEngine; using System.Collections; public class Bullet : MonoBehaviour { public float speed = 2; void Update(){ transform.Translate ( Vector3.up * speed * Time.deltaTime ); if (transform.position.y > 4.3f) { Destroy(this.gameObject); } } void OnTriggerEnter2D(Collider2D other) { if(other.tag == "Enemy"){ if(!other.GetComponent<Enemy>().isDeath){ //如果飞机死了,播放爆炸效果,子弹就不能碰撞它了 other.gameObject.SendMessage("BeHit"); //SendMessage("BeHit")作用是调用所有类中叫BeHit的方法 GameObject.Destroy(this.gameObject); } } }//检测碰撞,查mono }敌机:
using UnityEngine; using System.Collections; //定义枚举类型 public enum EnemyType{ smallEnemy, middleEnemy, bigEnemy } public class Enemy : MonoBehaviour { //定义枚举类型,设置飞机爆炸动画 public int hp=1; public float speed = 2; public float score = 100; public EnemyType type= EnemyType.smallEnemy; public bool isDeath = false;//死亡标志 public Sprite [] explosionSprites; private float timer = 0f; //播放动画需要的计时器,一般都使用私有 public int explosionAnimationFrame = 10; //动画播放帧率设置,每秒播放帧数,基本都是10 private SpriteRenderer render; //使用这个组件播放 public float hitTimer = 0.2f ; //碰撞播放时间 private float resetHitTime ; //充值碰撞时间的 public Sprite [] hitSprites; // Use this for initialization void Start () { render = this.GetComponent<SpriteRenderer> (); resetHitTime = hitTimer; hitTimer = 0; } // Update is called once per frame void Update () { this.transform.Translate ( Vector3.down*speed*Time.deltaTime ); if (this.transform.position.y <= -5.6) { Destroy(this.gameObject); } if (isDeath) { //如果死亡,就播放死亡爆炸动画 //if(typeof == EnemyType.smallEnemt){ timer += Time.deltaTime; int frameIndex = (int)(timer / (1f / explosionAnimationFrame)); if (frameIndex >= explosionSprites.Length) { //destroy Destroy (this.gameObject); } else render.sprite = explosionSprites [frameIndex]; //} } else { if(type == EnemyType.middleEnemy || type == EnemyType.bigEnemy){ if(hitTimer >= 0){ hitTimer -= Time.deltaTime; int frameIndex = (int) ((resetHitTime - hitTimer)/(1f / explosionAnimationFrame)); frameIndex%=2; render.sprite = hitSprites [frameIndex]; } } } } public void BeHit(){ hp-=1; //if( type == EnemyType.smallEnemy){ //hp-=1; if (hp <= 0) { isDeath = true; } //} else { hitTimer = resetHitTime; } } }
相关文章推荐
- Makefile 的函数-1
- 黑马程序员---android入学考试题
- 认识虚拟机
- 认识虚拟机
- Working out - CODEFORCES, 429B 动态规划
- poj 3020 Antenna Placement (最小边覆盖)
- 好记性不如烂笔头——关于精确度、召回率、F值、准确率
- Install wxWidgets-3.0.2 on GNU/Linux Debian
- linux cat
- 课设结束,期末来临
- STLPort、Loki之内存分配器
- 坑
- novaclient的api调用流程与开发
- 【LeetCode 100_二叉树_遍历】Same Tree
- Transportation (hdu 3667 最小费用最大流+拆边)
- 大话数据结构之三(栈和队列)
- linux alias
- <女人的起源>感触
- POJ-3414(Pots)——BFS
- 大约2014博文大赛