Unity 任务状态的获取 任务完成与游戏结束的判断和提示
2020-06-21 04:20
1081 查看
目录
任务完成条件:击杀n个敌人,n由关卡设定
游戏结束条件:没血
实现方式:
如果没血(curhealth==0),则游戏结束
利用挂载在主角身上的控制脚本进行计数,如果达到击杀数量就激活任务完成的提示文本
任务完成的判断依据:击杀目标数
每次击杀时,在子弹控制脚本BulletControl的OnCollisionEnter2D函数中修改该变量
任务完成的标志:方便其他函数和脚本调用
在玩家控制脚本中设定任务完成标记
类型为Static,以便其他脚本查询当前任务进度状态
当击杀数达到目标时,设定任务状态为1
在其他脚本调用时,使用PlayControl.showflag获取任务状态
格式 脚本名.参数名
记得在新的关卡开始的时候初始化为0
游戏结束代码
任务完成代码
第一部分、子弹脚本:
第二部分、玩家脚本(主要部分)
详细代码
[code]using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; using UnityEngine.UI; public class PlayerControl : MonoBehaviour { //主角速度 public float speed = 8f; Rigidbody2D rbody;//定义2d刚体 Animator anim;//定义动画 Vector2 lookDirection = new Vector2(1, 0);//初始向x看 GameObject robotObj;//定义一个机器人对象 //最大健康值 private int maxHealth=5; //当前健康值 private int currentHealth; //其他脚本可获取最大健康值 public int MyMaxHealth { get { return maxHealth; } } //其他脚本可获取当前健康值 public int MyCurrentHealth { get { return currentHealth; } } //敌人剩余数量 public static int enemyleft = 2; //public int curEnemyleft { get { return enemyleft; } } //无敌时间 private float wuditime = 2f; //无敌计时器 private float wuditimer; //无敌状态 private bool isWudi; //子弹数量 [SerializeField] private int curBulletCount=2; private int maxBulletCount=99; public int MyCurBulletCount { get { return curBulletCount; } } public int MyMaxBulletCount { get { return maxBulletCount; } } //子弹预制体 public GameObject bulletPrefab; //游戏结束提示 public GameObject GameOver; //指定为主角并销毁 public GameObject GameOverPlayer; //任务完成提示 public GameObject MissionCompleted; //无法实现在其他脚本中销毁提示,故在此脚本中限时销毁 public float showTime = 4; private float showTimer; //显示标志,一场游戏中只显示一次 private int showflag=0; //玩家音效 public AudioClip hitClip; public AudioClip launchClip; // Start is called before the first frame update void Start() { //隐藏任务完成提示 MissionCompleted.SetActive(false); //提示计时器设置为负值 showTimer = -1; //重新开始游戏后初始化敌人数量 enemyleft = 2; rbody = GetComponent<Rigidbody2D>();//获取2d刚体 anim = GetComponent<Animator>();//获取动画组件 //初始化生命值 currentHealth = 2; //初始化无敌时间 wuditimer = 0; //更新生命条与子弹数量 UIManager.instance.UpdateHealthBar(currentHealth, maxHealth); UIManager.instance.UpdateBulletCount(curBulletCount, maxBulletCount); } // Update is called once per frame void Update() { //任务完成提示计时 showTimer -= Time.deltaTime; //Debug.Log(showTimer); //超过时间就取消显示任务完成提示 if (showTimer < 0) { MissionCompleted.SetActive(false); } //敌人数量为0,并且是第一次达到0,之前没有完成任务,任务完成 if (enemyleft==0 && showflag != 1) { //给倒计时器赋值,以此显示提示 showTimer = showTime; //已经完成任务了,标记一下,之后不再显示 showflag = 1; //显示任务完成提示 MissionCompleted.SetActive(true); } //如果生命值为0,显示游戏结束字样,并销毁主角 if (currentHealth==0) { GameOver.SetActive(true); Destroy(GameOverPlayer); } //获取运动矢量 float moveX = Input.GetAxisRaw("Horizontal"); float moveY = Input.GetAxisRaw("Vertical"); Vector2 moveVector = new Vector2(moveX, moveY); if(moveX!=0||moveY!=0) { lookDirection = moveVector; } Vector2 position = transform.position; position.x += moveX * speed * Time.deltaTime; position.y += moveY * speed * Time.deltaTime; transform.position = new Vector2(position.x, position.y); rbody.MovePosition(position);//用刚体移动可以消除画面抖动 anim.SetFloat("move X",lookDirection.x);//为动画集赋值 anim.SetFloat("move Y",lookDirection.y); anim.SetFloat("runspeed", moveVector.magnitude);//状态集的切换由运动矢量决定 //赋值必须与状态集命名一样 //-------------------------------------------------- //如果处于无敌状态,就计时 if(isWudi) { wuditimer -= Time.deltaTime; //计时器归0,就不处于无敌状态了 if(wuditimer<0) { isWudi = false; } } //------------------------------------- //当按下J,并且子弹大于0,开火 if(Input.GetKeyDown(KeyCode.J) && curBulletCount>0) { ChangeBulletCount(-1); anim.SetTrigger("Launch"); AudioManager.instance.AudioPlay(launchClip); GameObject bullet = Instantiate(bulletPrefab, rbody.position+Vector2.up*0.5f, Quaternion.identity); BulletControl bc = bullet.GetComponent<BulletControl>(); if(bc!=null) { bc.Shoot(lookDirection, 300); } } //按E与npc交互 if(Input.GetKeyDown(KeyCode.E)) { RaycastHit2D hit = Physics2D.Raycast(rbody.position, lookDirection, 2f, LayerMask.GetMask("NPC")); if(hit.collider!=null) { Debug.Log("hit npc!"); NPCManager npc = hit.collider.GetComponent<NPCManager>(); if(npc!=null) { npc.ShowDialog(); } } } } private void OnTriggerEnter2D(Collider2D collision) { //踩到雷区,自动生成僵尸 float robotX = Random.Range(-3, 5); float robotY = Random.Range(-3, 5); Vector2 position_robot = new Vector2(robotX, robotY); if(collision.gameObject.tag=="bomb")//如果碰到雷区 { print("other.tag=" + collision.gameObject.tag);//这句一定要有,不然出不来 robotObj = Instantiate(Resources.Load("Prefabs/Robot"),position_robot,Quaternion.identity)as GameObject;//加载资源,生成一个预制体,做成一个对象 } } private void OnTriggerExit2D(Collider2D collision) { //离开雷区,僵尸消失 if(collision.gameObject.tag=="bomb") { Destroy(robotObj); } } public void chnageHealth(int amount) { //可能是受到伤害,也可能是加血 if(amount<0) { //如果是受伤,设置无敌状态,则2秒内不能受伤 if(isWudi==true) { return; } isWudi = true; //播放受伤动画 anim.SetTrigger("Hit"); //播放受伤音效 AudioManager.instance.AudioPlay(hitClip); //为无敌计时器赋值 wuditimer = wuditime; } //更改健康值 currentHealth = Mathf.Clamp(currentHealth+amount,0,maxHealth); //更新血条 UIManager.instance.UpdateHealthBar(currentHealth, maxHealth); //调试 Debug.Log(currentHealth + "/" + maxHealth); } public void ChangeBulletCount(int amount) { //改变子弹数 curBulletCount = Mathf.Clamp(curBulletCount + amount, 0, maxBulletCount); //改变UI子弹数 UIManager.instance.UpdateBulletCount(curBulletCount, maxBulletCount); } }
减少剩余敌人数,是在子弹脚本中实现的
[code]using System.Collections; using System.Collections.Generic; using UnityEngine; public class BulletControl : MonoBehaviour { Rigidbody2D rbody; //子弹命中声 public AudioClip hitClip; // Start is called before the first frame update void Awake() { rbody = GetComponent<Rigidbody2D>(); //2秒后不管打没打中,子弹销毁子弹 Destroy(this.gameObject, 2f); } // Update is called once per frame void Update() { } //子弹发射,射击 public void Shoot(Vector2 moveDirection,float moveForce) { rbody.AddForce(moveDirection * moveForce); } //子弹命中 private void OnCollisionEnter2D(Collision2D collision) { //调用机器人控制脚本的修复函数,修改机器人的状态 RobotControl ec = collision.gameObject.GetComponent<RobotControl>(); if (ec!=null) { Debug.Log("命中敌人了"); ec.Fixed();//杀敌 //更改玩家控制中的击杀数,以此判断任务是否完成,格式:脚本名.静态变量--; PlayerControl.enemyleft--; } //播放命中声 AudioManager.instance.AudioPlay(hitClip); //立即销毁子弹 Destroy(this.gameObject); } }
附完整教程:
相关文章推荐
- Unity判断手势的滑动方向,单点触摸和多点触摸,并获取刚触摸以及触摸结束事的坐标
- Unity判断手势触摸的类型 ,判断手势的滑动方向,并获取刚触摸以及触摸结束事的坐标
- Unity学习笔记 [1st - 3rd] —— 小游戏制作完成
- 判断checkbox的状态后实现跳转或者显示提示弹框
- Unity3d 判断手势触摸的类型 ,判断手势的滑动方向,并获取刚触摸以及触摸结束事的坐标
- 【Android】状态栏相关适配(判断MIUI,Flyme,状态栏图标颜色切换,获取状态栏高度,沉浸式状态栏相关等)
- 判断一个线程是否执行结束以及获取线程退出码
- BootStrap Table复选框默认选中功能的实现代码(从数据库获取到对应的状态进行判断是否为选中状态)
- 加载多张图片,判断加载完成状态
- 完成系统登录程序,从命令行输入用户名和密码,如果没有输入用户名和密码,则提示输入用户名和密码;如果输入了用户名但是没有输入密码,则提示用户输入密码,然后判断用户名是否是mldn,密码是否是hello,
- 判断SIM卡状态,获取SIM卡信息
- 解析Android游戏中获取电话状态进行游戏暂停或继续的解决方法
- Android -- 程序判断手机ROOT状态,获取ROOT权限
- C#开发Unity游戏教程之判断语句
- js判断图片加载完成后获取图片实际宽高
- JIRA状态为任务结束,但是解决结果为未解决相关配置
- JIRA状态为任务结束,但是解决结果为未解决相关配置
- Unity游戏开发笔记:获取主角周围的怪物
- unity 判断鼠标左键在按下的状态