赞
踩
虽然大二寒假做过一次,但已经快忘光光了。。
所以这次要认真记录一下知识点!
//0415更新
新添实现敌机生成、单例模式添加音乐特效等
//0408更新
总共实现了背景轮播、控制飞机走动、发射子弹的功能。
就是两块Image顺序向下滚动,当第一张图片顶部走出摄像机视野范围时,将其的位置改变到第二张图片的上方 (我也不知道咋描述,反正以后我自己能看懂就行嘿嘿) 。
void Update()
{
this.transform.Translate(Vector3.down * moveSpeed * Time.deltaTime);
if (transform.position.y <= -BGLong)
{
transform.position =new Vector3(transform.position.x,transform.position.y+BGLong * 2,transform.position.z);
}
}
以后切记一定要调整好模型的大小、缩放比例、旋转角度等,再在外面套个空物体!!所有操作只需在外面那层空物体上执行即可,模型就只是model,调整好了就不用再管它啦!
切记调位置调父物体,调角度调子物体(子物体位置(0,0,0)即可)!!!
还有切记也要调整好子物体与父物体之间的位置关系,一般情况下子物体位置都设成(0,0,0)即可,这个是相对位置,即相对父物体的位置差(也就是跟父物体在同一位置上)。
(特别是这种套中套中套的关系,一定要整理好各自之间的位置)
首先在Player下新建几个空物体,调整好位置、角度,后期子弹生成会按照此位置和角度生成。
注:可以给空物体加上颜色标识符,便于我们确定空物体的位置。
在playerMove里编写子弹生成代码
void gunFire()
{
gameMessage.instance.PlayAudioClip("shoot");
//导入预置体
GameObject bullet = Resources.Load<GameObject>("bullet");
//获取开火口下的子物体位置
for (int i = 0; i < fireTrans.childCount; i++)
{
//将子物体位置赋值给子弹
GameObject bullet1= Instantiate(bullet,fireTrans.GetChild(i).position, fireTrans.GetChild(i).rotation);
// bullet1.transform.SetParent(fireTrans.GetChild(i).transform);
}
}
然后在update里调用 按下鼠标右键发设子弹
if (Input.GetMouseButtonDown(0))
{
gunFire();
}
新建控制子弹脚本,并把它挂到子弹预置体上,需要实现子弹向上运动,以及三秒钟销毁、碰到敌人给敌人减血等功能。
void Update()
{
this.transform.Translate(new Vector3(0,1,0)* gunSpeed * Time.deltaTime);
Destroy(gameObject, 3);
}
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Enemy")
{
other.gameObject.GetComponent<EnemyHP>().enemyHP -= 30;
}
}
实现wasd键控制上下左右移动即可
float x = Input.GetAxis("Horizontal");
float y = Input.GetAxis("Vertical");
this.transform.Translate(new Vector3(x, y, 0) * playerSpeed);
每隔几秒随机生成一个敌机,并给它设定好位置范围即可
public class EnemyCreate : MonoBehaviour { public GameObject[] Enemys; void Start() { //每延迟5秒执行一次 InvokeRepeating("_EnemyBirth", 5, 1); } //生成敌人 public void _EnemyBirth() { //随机生成敌人类型 int i = Random.Range(0, Enemys.Length); GameObject obj = Instantiate(Enemys[i]); //随机生成敌人坐标(只需随机生成X轴即可,让敌机贴着背景最上面那个范围生成即可) float x = Random.Range(7.5f,12.5f); obj.transform.position = new Vector3(x, 5.5f, 9f); } }
新建一个EnemyHP,加在敌机预置体上,控制敌机血量
敌机血量初始值100,每被一个子弹击中都会减血量30,被打到四次便会击毙。
public class EnemyHP : MonoBehaviour
{
public int enemyHP = 100;
private float enemySpeed = 2f;
void Update()
{
//敌机向下飞行
this.transform.Translate(new Vector3(0, -1, 0) * enemySpeed * Time.deltaTime);
if (enemyHP <= 0)
{
Destroy(gameObject);
UIText.score++;
}
}
}
在控制子弹脚本里可以调用EnemyHP脚本中的enemyHP变量来给敌机减血。
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Enemy")
{
other.gameObject.GetComponent<EnemyHP>().enemyHP -= 30;
}
}
敌机脚本的分数加一操作
if (enemyHP <= 0)
{
Destroy(gameObject);
UIText.score++;
}
这样设置一个静态变量相当于多个脚本都可以对此变量进行操作
新建UIText脚本,管理玩家的分数。将score设成全局变量,这样所有的敌机脚本当执行摧毁敌机函数时,都可以对此变量进行加1操作
public class UIText : MonoBehaviour
{
public Text text;
//静态变量,多脚本改变这一个值
public static int score=0;
// Update is called once per frame
void Update()
{
text.text = "分数"+score;
}
}
单例模式即把整个脚本设成唯一的全局变量
public class gameMessage : MonoBehaviour { //整个脚本都是全局变量,在其他脚本都可以调用此脚本中的变量、函数 //单例模式 public static gameMessage instance; public AudioSource audioSouce; //音乐数组 public AudioClip[] audioClip; Dictionary<string, AudioClip> dictionary = new Dictionary<string, AudioClip>(); void Start() { //声明一下 instance = this; foreach(AudioClip clip in audioClip) { //向字典里储存 dictionary.Add(clip.name, clip); } } void Update() { } /// <summary> /// 播放音乐片段 /// </summary> /// <param name="audioName"></param> public void PlayAudioClip(string audioName) { //判断字典中是否包含key=audioName if (dictionary.ContainsKey(audioName)) { AudioClip clipp = dictionary[audioName]; audioSouce.clip = clipp; audioSouce.Play(); } } }
在别的脚本里便可以随意调用此脚本里的函数和变量
比如说就在开火函数里就可以调用函数播放背景音乐
void gunFire()
{
gameMessage.instance.PlayAudioClip("shoot");
。。。。。
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。