VR模拟枪支打靶,消灭鬼怪,换弹以及上弦等等硬核枪支操作。 使用HTCVive设备,开启SteamVR进行游玩。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

281 lines
11 KiB

3 years ago
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
//难度控制类,用于改变刷新的怪物的战斗力数值
//该类为刷兵关卡设计的基类
public class DiffultyController : MonoBehaviour {
[Range (1,3)]
public int diffcultyLevel;
//波次数
[Range(1, 30)]
public int turn_;
//剩余波次
private int remainTurn;
//每波数量
[Range(5,40)]
public int Number_;
//每波剩余数量
private int remainNumber;
//
//关卡配置(根据关卡对波次数量刷兵进行配置)
public int stageNum;
public StageAdapter_1 stage;
public StageAdapter_1[] allstage;
//显示相关
public Text remainTurnTxt;
public Text remainNumberTxt;
public Text stageTxt;
//敌人生成相关
//生成类型
public GameObject enemy_1;
public GameObject enemy_2;
public GameObject enemy_3;
public GameObject enemy_4;
public GameObject enemy_5;
public GameObject enemy_6;
//生成的数组(所有需要生成的敌人)
public GameObject[] enemyAll_;
//所有生成的boss(基本上关底出现,一个到两个左右)
public GameObject[] bossAll_;
//生成地点
public List<Transform> birthPoint_1;
public MenuController_2 menu;
//生成怪物特效
public GameObject birthParticle;
//玩家相关
public GameObject player;
// Use this for initialization
void Start () {
stageNum = 0;
}
// Update is called once per frame
void Update () {
}
//简单模式
public void EasyMode() {
diffculityChange_Hp(1);
StartCoroutine(StageAction(stage));
}
//一般难度模式
public void NormalMode() {
diffculityChange_Hp(2);
StartCoroutine(StageAction(stage));
}
//困难模式
public void DiffcultMode() {
diffculityChange_Hp(3);
StartCoroutine(StageAction(stage));
}
//关卡之间的切换与继续游戏
public void nextStage() {
if (allstage[stageNum])
{
int stageNum_Next = stageNum + 1;
stageTxt.text = "下一关准备(第"+ stageNum_Next + "关)";
stage = allstage[stageNum];
}
else {
//游戏结束,至此全部通关
}
}
public void gameContinue() {
StartCoroutine(StageAction(stage));
}
//实现批次进行进攻
IEnumerator EasyAction() {
while (remainTurn > 0) {
for (int i = 0; i < Number_; i++)
{
GameObject enemy_ = Instantiate(enemy_1);
GameObject birthParticle_1 = Instantiate(birthParticle);
enemy_.SetActive(true);
int pos = i % 3;
enemy_.transform.position = birthPoint_1[pos].position;
enemy_.transform.localEulerAngles = new Vector3(0,Random.Range(0,360f),0);
yield return new WaitForSeconds(0.16f);
}
remainTurn -= 1;
yield return new WaitForSeconds(40f);
}
}
//关卡适配后的刷兵方案
IEnumerator StageAction(StageAdapter_1 stage) {
//关闭菜单
menu.closeAllMenu();
//初始化玩家
player.GetComponent<PlayerControl>().enabled = true;
player.GetComponent<MovingCtrol>().enabled = true;
player.GetComponent<PlayerControl>().rightPointer.SetActive(false);
player.GetComponent<PlayerControl>().leftPointer.SetActive(false);
player.GetComponent<PlayerControl>().Weapon_.SetActive(true);
//敌人1生成数量
int enemy_1_Count = Random.Range(stage.enemy_1_Count_min, stage.enemy_1_Count_max);
int enemy_2_Count = Random.Range(stage.enemy_2_Count_min, stage.enemy_2_Count_max);
int enemy_3_Count = Random.Range(stage.enemy_3_Count_min, stage.enemy_3_Count_max);
int enemy_4_Count = Random.Range(stage.enemy_4_Count_min, stage.enemy_4_Count_max);
int enemy_5_Count = stage.lastWaveEnemy_5_Count;
int last_Count = stage.allEnemyCount - enemy_1_Count - enemy_2_Count - enemy_3_Count - enemy_4_Count;
remainTurn = stage.allEnemyWave;
remainTurnTxt.text = remainTurn + " / " + stage.allEnemyWave;
while (remainTurn > 0)
{
for (int i = 0; i < enemy_1_Count; i++)
{
GameObject enemy_ = Instantiate(enemy_1);
enemy_.SetActive(true);
enemy_.GetComponent<Hurtable>().deathEvent.AddListener(reduceEnemyCount);
int pos = i % 3;
GameObject birthParticle_1 = Instantiate(birthParticle);
birthParticle_1.transform.position = birthPoint_1[pos].position;
enemy_.transform.position = birthPoint_1[pos].position;
enemy_.transform.localEulerAngles = new Vector3(0, Random.Range(0, 360f), 0);
produceEnmeyCount(1);
remainNumberTxt.text = remainNumber + "";
yield return new WaitForSeconds(0.16f);
}
for (int i = 0; i < enemy_2_Count; i++)
{
GameObject enemy_ = Instantiate(enemy_2);
enemy_.SetActive(true);
enemy_.GetComponent<Hurtable>().deathEvent.AddListener(reduceEnemyCount);
int pos = i % 3;
GameObject birthParticle_1 = Instantiate(birthParticle);
birthParticle_1.transform.position = birthPoint_1[pos].position;
enemy_.transform.position = birthPoint_1[pos].position;
enemy_.transform.localEulerAngles = new Vector3(0, Random.Range(0, 360f), 0);
produceEnmeyCount(1);
remainNumberTxt.text = remainNumber + "";
yield return new WaitForSeconds(0.16f);
}
for (int i = 0; i < enemy_3_Count; i++)
{
GameObject enemy_ = Instantiate(enemy_3);
enemy_.SetActive(true);
enemy_.GetComponent<Hurtable>().deathEvent.AddListener(reduceEnemyCount);
int pos = i % 3;
GameObject birthParticle_1 = Instantiate(birthParticle);
birthParticle_1.transform.position = birthPoint_1[pos].position;
enemy_.transform.position = birthPoint_1[pos].position;
enemy_.transform.localEulerAngles = new Vector3(0, Random.Range(0, 360f), 0);
produceEnmeyCount(1);
remainNumberTxt.text = remainNumber + "";
yield return new WaitForSeconds(0.16f);
}
for (int i = 0; i < enemy_4_Count; i++)
{
GameObject enemy_ = Instantiate(enemy_4);
enemy_.SetActive(true);
enemy_.GetComponent<Hurtable>().deathEvent.AddListener(reduceEnemyCount);
int pos = i % 3;
GameObject birthParticle_1 = Instantiate(birthParticle);
birthParticle_1.transform.position = birthPoint_1[pos].position;
enemy_.transform.position = birthPoint_1[pos].position;
enemy_.transform.localEulerAngles = new Vector3(0, Random.Range(0, 360f), 0);
produceEnmeyCount(1);
remainNumberTxt.text = remainNumber + "";
yield return new WaitForSeconds(0.16f);
}
for (int i = 0; i < last_Count; i++)
{
GameObject enemy_ = Instantiate(enemyAll_[stage.remainEnemyType]);
enemy_.SetActive(true);
enemy_.GetComponent<Hurtable>().deathEvent.AddListener(reduceEnemyCount);
int pos = i % 3;
GameObject birthParticle_1 = Instantiate(birthParticle);
birthParticle_1.transform.position = birthPoint_1[pos].position;
enemy_.transform.position = birthPoint_1[pos].position;
enemy_.transform.localEulerAngles = new Vector3(0, Random.Range(0, 360f), 0);
produceEnmeyCount(1);
remainNumberTxt.text = remainNumber + "";
yield return new WaitForSeconds(0.16f);
}
remainTurn -= 1;
remainTurnTxt.text = remainTurn + " / " + stage.allEnemyWave;
if (remainTurn == 1) {
//最后一波大怪刷新
for (int i = 0; i < enemy_5_Count; i++)
{
GameObject enemy_ = Instantiate(enemy_5);
enemy_.SetActive(true);
enemy_.GetComponent<Hurtable>().deathEvent.AddListener(reduceEnemyCount);
int pos = i % 3;
GameObject birthParticle_1 = Instantiate(birthParticle);
birthParticle_1.transform.position = birthPoint_1[pos].position;
enemy_.transform.position = birthPoint_1[pos].position;
enemy_.transform.localEulerAngles = new Vector3(0, Random.Range(0, 360f), 0);
produceEnmeyCount(1);
remainNumberTxt.text = remainNumber + "";
yield return new WaitForSeconds(0.16f);
}
}
if (remainTurn <= 0) {
break;
}
yield return new WaitForSeconds(stage.nextWaveSecond);
}
//等待怪物数量减少
print("endBirth");
while (remainNumber>0) {
yield return new WaitForEndOfFrame();
}
yield return new WaitForSeconds(10f);
stageNum++;
print("endEnemy");
//开启下一关菜单
//返回菜单玩家
player.GetComponent<PlayerControl>().enabled = false;
//player.GetComponent<MovingCtrol>().enabled = false;
player.GetComponent<PlayerControl>().rightPointer.SetActive(true);
player.GetComponent<PlayerControl>().leftPointer.SetActive(true);
player.GetComponent<PlayerControl>().Weapon_.SetActive(false);
if (stageNum<=10) {
nextStage();
menu.openMenu(6);
}
VoiceController_ Vcontroller_1 = GameObject.FindGameObjectWithTag("audioController").GetComponent<VoiceController_>();
Vcontroller_1.StopAllAudio();
yield return null;
}
//敌人数量减少
public void reduceEnemyCount() {
remainNumber = remainNumber - 1;
remainNumberTxt.text = remainNumber+"";
}
public void produceEnmeyCount(int count) {
remainNumber = remainNumber + count;
remainNumberTxt.text = remainNumber + "";
}
//get
public int getRemainTurn() {
return remainTurn;
}
public int getRemainNumber() {
return remainNumber;
}
//难度控制
public void diffculityChange_Hp(int HpPercent) {
enemy_1.GetComponent<Hurtable>().hp *= HpPercent;
enemy_2.GetComponent<Hurtable>().hp *= HpPercent;
enemy_3.GetComponent<Hurtable>().hp *= HpPercent;
enemy_4.GetComponent<Hurtable>().hp *= HpPercent;
enemy_5.GetComponent<Hurtable>().hp *= HpPercent;
}
}