首先这里我们有俩个玩家,每一个玩家都有所对应的脚本以及操作,这里就需要用到对象数组去存储玩家(当然集合也可以使用,其方法大同小异),这里我用的是数组存储。
private GameObject[] players;//玩家存放器
通过 GameObject.FindGameObjectsWithTag查询多个相同标签的对象
players = GameObject.FindGameObjectsWithTag("Player");
为了方便知道对应玩家,这里给把玩家一一对应,避免出现找不到。
players[0] = GameObject.Find("Player1");
players[1] = GameObject.Find("G36C@Draw");
注:这里如果使用循环去依次查找玩家的话,用SetAction去隐藏其中一个玩家会出现下标异常的错误,因为隐藏玩家之后所对应的脚本,以及目标都会消失,无法获取。就相对于原本要查询俩个东西,一个东西突然消失找不到了,就异常了。
玩家的切换这里用到的是一个实时更新位置的一个操作,根据游戏的进行每帧进行调取玩家所对应的位置。通过查找Tag的方式取查找所对应的人的位置
player = GameObject.FindWithTag("Player").transform;
void Update()
{
//每帧都调取更新玩家的位置
player = GameObject.FindWithTag("Player").transform;
if (feng >= 50)//当积分>50的时候开启切换玩家的功能
{
change = true;
Changeplayer(change);//变换角色
}
//用于禁用玩家死后的脚本
tt();
}
tt()方法是用于禁用玩家的全部脚本,这里因为玩家有两位所以需要判定
void tt()//角色死后脚本禁用
{
//玩家血量为空
if (PlayerHp <= 0)
{
if (p1 != null)
{
//获取查找脚本,并关闭
p1.GetComponent<PlayerACR>().enabled = false;
p1.GetComponent<MouseLook>().enabled = false;
}
if (p2 != null)
{
p2.GetComponent<PlayerTwoG36C>().enabled = false;
p2.GetComponent<MouseLook>().enabled = false;
}
//死亡UI
PlayerDie.SetActive(true);
}
change = true;
Changeplayer(change);找到玩家并显示玩家,在原来玩家的位置上更新到另一个玩家
这里判断玩家是否存在,并给其所对应的操作。
void Changeplayer(bool c)//换角色判断传入
{
if (c)
{
if (Input.GetKeyDown(KeyCode.Alpha1))//切换玩家2号
{
players[0].SetActive(false);//玩家1
players[1].SetActive(true);//玩家2
//players[0].GetComponent<PlayerACR>().enabled = false;
//players[1].GetComponent<PlayerTwoG36C>().enabled = true;
players[1].transform.position = player.position;
}
if (Input.GetKeyDown(KeyCode.Alpha2))//切换玩家1号
{
players[0].SetActive(true);
players[1].SetActive(false);
//players[0].GetComponent<PlayerACR>().enabled = true;
//players[1].GetComponent<PlayerTwoG36C>().enabled = false;
players[0].transform.position = player.position;
}
}