上节我们完成了“妖怪”功能的开发,“孙悟空”也已经能够寻找到妖怪并发起攻击了。但是我们发现,现在的攻击对“妖怪”无任何伤害效果。这一节我们将它完善,使“孙悟空”的攻击具有杀伤力。这段代码主要是完成碰撞“妖怪”角色的检测,然后对“妖怪”角色减血。
1. 新建一个C#脚本命名为BulletScript。添加如下代码:
using UnityEngine;
using System.Collections;
public class BulletScript : MonoBehaviour
{
float seconds = 3;
public GameObject playerShooting;
void OnCollisionEnter(Collision other) //如果碰撞到命名为“Player”的物体,销毁自身。
{
if (other.gameObject.name == "Player")
{
Destroy(this.gameObject);
}
if (other.gameObject.GetComponent()) //如果角色身上附有Health脚本,脚本中的血量下降十,并把health中的enemy设置为发射子弹的角 //色。
{
Health.enemy = playerShooting.name;
Health.UpOrDown(-10);
}
}
IEnumerator Start() //在没碰到角色的情况下,三秒钟销毁自己
{
yield return new WaitForSeconds(seconds);
Destroy(this.gameObject);
}
}
2. 接下来我们要为摄像机制作跟随妖怪移动的效果。这段代码由Character Controller包中的SmoothFollow修改而来,原脚本为JS脚本,这里我修改成了C#版本的,然后又添加了妖怪角色生存状态的判断。新建一个C#脚本,命名为SmoothFollow。添加如下代码:
using UnityEngine;
using System.Collections;
public class SmoothFollow : MonoBehaviour {
// 要跟踪的目标物体
public Transform target ;
// 在 x-z 平面下到目标的距离
public float distance = 10.0f;
// 相机在目标身上的高度偏移值
public float height = 5.0f;
// 旋转阻尼
public float heightDamping = 2.0f;
public float rotationDamping = 3.0f;
Health playerHealthScript;
void Start()
{
playerHealthScript = target.root.GetComponent();
}
void LateUpdate ()
{
if(!target)
return;
if (Health.alive)
{
// 计算当前状态的旋转角度
float wantedRotationAngle = target.eulerAngles.y;
float wantedHeight = target.position.y + height;
float currentRotationAngle = transform.eulerAngles.y;
float currentHeight = transform.position.y;
// 缓慢旋转自身角度到目标角度
currentRotationAngle = Mathf.LerpAngle (currentRotationAngle, wantedRotationAngle, rotationDamping * Time.deltaTime);
// 高度渐变
currentHeight = Mathf.Lerp (currentHeight, wantedHeight, heightDamping * Time.deltaTime);
// 把角度转换为Quaternion值
Quaternion currentRotation = Quaternion.Euler(0, currentRotationAngle, 0);
// 设置相机距离目标的值
transform.position = target.position;
transform.position -= currentRotation * Vector3.forward * distance;
// 设置相机高度
transform.position =new Vector3(transform.position.x, currentHeight,transform.position.z);
// 保证总是面向目标
transform.LookAt (target);
}
}
}
3. 将代码附加到场景中的主相机上,把目标设置为Player(这里指妖怪)。运行即可发现,现在相机已经能够跟随角色行走了,并且可以平滑的旋转和移动。攻击效果如图
4. 不知道大家还记不记得,在最开始的时候我们说过,场景中还有一个扮演“猪八戒”的角色。他主要负责在原地攻击,当“妖怪”靠近的时候,他就会发动攻击。现在我们来完成他的功能,让他能够在"妖怪"靠近“唐僧”的时候,发动攻击。新建一个C#脚本,命名为EnemyBotScript。为它添加如下代码:
using UnityEngine;
using System.Collections;
public class EnemyBotScript : MonoBehaviour
{
public float attackDistance = 10.0f;
enum EnemyAIStatus { Idle = 0, Attack = 1 } //觉色所处状态,攻击或者待机
private EnemyAIStatus status = EnemyAIStatus.Idle;
public Transform hand; //发射攻击武器的手,由这个位置产生子弹
public Transform player; //妖怪角色
public GameObject fireBall; //攻击武器
public float fireRate = 1.4f; //攻击频率
private float nextFire = 0;
CharacterController controller;
void Awake()
{
controller = GetComponent();
}
void Update()
{
CheckStatus();
switch (status)
{
case EnemyAIStatus.Idle:
Idle();
break;
case EnemyAIStatus.Attack:
Attack();
break;
}
}
void CheckStatus()
{
var dist = (player.position - transform.position).magnitude;
if (dist < attackDistance && Health.alive) //根据当前和妖怪的距离和妖怪的生存状态,判断是攻击还是静止站立 { status = EnemyAIStatus.Attack; } else { status = EnemyAIStatus.Idle; } } void Attack() { if (Health.alive == true) //如果妖怪是活着的时候,转向角色,并发动攻击 { transform.LookAt(player.transform); animation.CrossFade("attack"); if (Time.time > nextFire)
{
nextFire = Time.time + fireRate;
GameObject clone = Instantiate(fireBall, hand.position, hand.rotation) as GameObject; //生成一个子弹物体
Physics.IgnoreCollision(clone.collider, collider);
clone.rigidbody.velocity = transform.TransformDirection(Vector3.forward * 20); //为子弹添加一个向前的力
BulletScript bulletScript = clone.gameObject.AddComponent(); //为子弹物体自动附加BulletScript脚本
bulletScript.playerShooting = this.gameObject;
}
}
}
void Idle() //播放静止动画
{
animation.CrossFade("idle");
}
}
5. 将它添加到”猪八戒“角色的物体上。分别设置Player 和fireBall为妖怪角色和子弹物体。设置hand为角色的手。各脚本设置如下:
6. 到这里为止,我们已经完成了所有的代码编写工作,基本设计的功能也已经完成。这里只是提供一个大致的基本逻辑思想,比如大家可以根据西游记中的情节添加更多的功能,可以添加”沙僧“,”白龙马“。他们都有不同的攻击技能,它们也有不同的武器和杀伤力。还可以在每个等级下添加不同的”妖怪“,每个妖怪又有不同的法宝和技能……
大家可以基于这个示例来进一步改进,开发出自己的AI游戏作品。