在Zombie_Target脚本中,将targetTransform改为public
public Transform targetTransform;
在预制件Zombie中添加新的脚本Zombie_Attack
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class Zombie_Attack : NetworkBehaviour {
//攻击频率
private float attackRate = 3;
//下一次攻击时间
private float nextAttack;
//伤害
private int damage = 10;
//与Player的最小距离,若小于这个值则进行攻击
private float minDistance = 2;
//与Player的距离
private float currentDistance;
//自身的transform
private Transform myTransform;
//Zombie_Target的脚本
private Zombie_Target targetScript;
//定义两个Material来代表是否攻击了玩家(绿色为没攻击,红色为攻击了)
[SerializeField]
private Material zombieGreen;
[SerializeField]
private Material zombieRed;
void Start ()
{
//获取自身的transform和Zombie_Target脚本
myTransform = transform;
targetScript = GetComponent<Zombie_Target>();
//如果是服务端,开启协程Attack
if (isServer)
{
StartCoroutine(Attack());
}
}
//检查目标玩家是否在范围内
void CheckIfTargetInRange()
{
//如果目标玩家存在的话
if (targetScript.targetTransform != null)
{
//计算僵尸与目标玩家之间的距离
currentDistance = Vector3.Distance(targetScript.targetTransform.position, myTransform.position);
//若小于最小距离且获取现在的时间,现在的时间也大于下一次攻击的时间
if (currentDistance < minDistance && Time.time > nextAttack)
{
//将下一次攻击的时间定义为现在的时间加上攻击的频率
nextAttack = Time.time + attackRate;
//目标玩家的生命值减少
targetScript.targetTransform.GetComponent<Player_Health>().DeductHealth(damage);
//开启协程ChangeZombieMat(只在服务端进行)
StartCoroutine(ChangeZombieMat());
//调用函数
RpcChangerZombieAppearance();
}
}
}
//将僵尸的material改为红色,过attackRate/2的时间后改为绿色
IEnumerator ChangeZombieMat()
{
GetComponent<Renderer>().material = zombieRed;
yield return new WaitForSeconds(attackRate/2);
GetComponent<Renderer>().material = zombieGreen;
}
//告诉客户端开始协程ChangeZombieMat?
[ClientRpc]
void RpcChangerZombieAppearance()
{
StartCoroutine(ChangeZombieMat());
}
//检查目标玩家是否在范围内
IEnumerator Attack()
{
for (; ; )
{
yield return new WaitForSeconds(0.2f);
CheckIfTargetInRange();
}
}
}
这次写了注释了= =在考虑要不要录个视频什么的,关于UNET的教程国内好少,有点心塞