当敌人距离玩家10米时系统提示: 在玩家哪个方向,警告提示+警报+2s红色,退出敌人攻击范围,重新判定;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/*
*创建者:
*创建时间:
*描述:
*版本:
*/
public class Player : MonoBehaviour
{
GameObject alarm,alarmLight;//警告图标文本(共享),警告灯光(个体)
Text alarmDirection;//警告方位文本;(共享)
bool isTargetCamera;//判断瞄准镜开关状态;
Enemy enemyAlarm;//警告的游戏对象的脚本(共享)
GameObject go;//警告过的游戏对象(共享)玩家切换枪支不重复触发
GameObject gameOverPanel;//游戏结束面板(共享)
Text tap;//游戏结束文本;(共享)
float speed = 1;//(共享)
//所有共享数据需要放在游戏管理器中
void Start()
{
alarmLight = transform.GetChild(1).gameObject;//获取警告灯光;
}
void Update()
{
Detection();//探测敌人方位方法;
}
void Detection()//探测
{
if (GameManager.GetInstance().numb == 3)//击倒3个敌人
{
GameObject[] gameObjects = GameObject.FindGameObjectsWithTag(StaticGameResources.enemyTag);//当玩家击败敌人数量到达3时,场上敌人已经全部击败,进行克隆生成下一波3个敌人,并将场面上新克隆出的3个敌人收集在对象数组;
if (gameObjects.Length==3)
{
GameManager.GetInstance().enemys = gameObjects;//将获取到敌人存放进游戏管理器进行共享,防止切换玩家,玩家不识别场景中的敌人;
for (int i = 0; i<3;i++)//对象数组存储所有敌人;
{
GameManager.GetInstance().list.Add(GameManager.GetInstance().enemys[i]);//方便动态消失;
GameManager.GetInstance().numb--;//读取到场景中一个敌人,击败敌人数量减少,防止重复添加相同的对象(不使用Contains的原因是场景中克隆出来的对象是一样的,无法判断不同);
}
}
}
if (GameManager.GetInstance().list.Count>0)//防止场景中敌人数量为0,进行查找报空;
{
for (int i = 0; i < GameManager.GetInstance().list.Count; i++)
{
if (GameManager.GetInstance().list[i]!=null&&Vector3.Distance(transform.position, GameManager.GetInstance().list[i].transform.position) <= 10 )//当玩家和敌人距离<10时将该敌人赋值给游戏管理器中的一个游戏对象,并且获取该敌人的脚本同样赋值给游戏管理器中的一个脚本对象;
{
GameManager.GetInstance().go= GameManager.GetInstance().list[i];
GameManager.GetInstance().enemyAlarm = GameManager.GetInstance().list[i].GetComponent<Enemy>();
if (GameManager.GetInstance().enemyAlarm.alarmFirst)//通过上一步获取到的脚本对象,对是否是第一次警告的布尔值(alarmFirst)判断,若为真则触发警报;
{
GameManager.GetInstance(). alarm.SetActive(true);//警报文本(公共UI)
alarmLight.SetActive(true);(玩家自身子对象)
float a = Vector3.Dot(transform.forward, GameManager.GetInstance().list[i].transform.position - transform.position);//前后方位;
Vector3 b = Vector3.Cross(transform.forward, GameManager.GetInstance().list[i].transform.position - transform.position);//左右方位
if (a >= 0 && b.y > 0)
{
GameManager.GetInstance().alarmDirection.text = "右前方";
}
else if (a >= 0 && b.y < 0)
{
GameManager.GetInstance().alarmDirection.text = "左前方";
}
else if (a < 0 && b.y > 0)
{
GameManager.GetInstance().alarmDirection.text = "右后方";
}
else
{
GameManager.GetInstance().alarmDirection.text = "左后方";
}
Invoke("Close", 2f);
}
}
if (GameManager.GetInstance().go != null && Vector3.Distance(transform.position, GameManager.GetInstance(). go.transform.position) > 10)//若接触过的游戏对象距离>10,将警告重新赋值true,距离又<10时,继续警告;
{
GameManager.GetInstance(). enemyAlarm = GameManager.GetInstance().go.GetComponent<Enemy>();
GameManager.GetInstance(). enemyAlarm.alarmFirst=true;
}
}
}
}
}