您的位置:首页 > 移动开发 > Unity3D

unity3d学习(三)制作敌人简单AI和发射火球

2017-03-02 22:03 525 查看

制作敌人简单AI和发射火球

写在前面:

- 学习课本:Unity5实战 使用c#和unity开发多平台游戏-作者:Joseph Hocking

- 内容:第三章

-unity3d学习(一)制作第一人称射击-玩家的视口和移动

-unity3d学习(二)制作第一人称射击-玩家的视口和移动

简单的敌人自动移动(AI)和死亡

第一步:创建一个新脚本 Wandering
给敌人添加Wandering 脚本,并输入以下代码

using UnityEngine;
using System.Collections;

public class Wandering: MonoBehaviour
{
public float speed = 3.0f;
public float obstacleRnage = 5.0f;

private bool _alive;//判断用户是否存活
void Start () {
_alive = true;
}

void Update()
{
if(!_alive)
{
return;//如果没有活着,则停止运行下面代码
}
transform.Translate(0,0,speed*Time.deltaTime);//保持每帧向前移动

Ray ray = new Ray(transform.position,transform.forward);//向前面发射一条射线
RaycastHit hit;
if(Physics.SphereCast(ray,0.75f,out hit))
{
if(hit.distance<obstacleRnage)
{
float angle = Random.Range(-110,110);
transform.Rotate(0,angle,0);
}
}
}

public void setAlive(alive)
{
_alive = alive;
}
}


第二步:修改ReactiveTarget脚本

...
public void ReactToHit()
{
wanderingAI behavior = GetCompent<WanderingAI>()
if(behavior)
{
behavior.setAlive(false);
}
StartCoroutine(Die());
}
...


第三步:给敌人创建预设
添加一个预设体,以便我们后面添加此物体

第四步:添加一个不可见的SceneController空对象
在SceneController中添加SceneController脚本,使当玩家击杀一个敌人,再次生成一个新的敌人

using UnityEngine;
using System.Collections;

public class SceneController: MonoBehaviour
{
[SerializeField] private GameObject enemyPrefab;//序列化预设对象
private GameObject _enemy;

void Update()
{
if(_enemy==null)
{
_enemy = Instantiate(enemyPrefab) as GameObject;
_enemy.transform.position = new Vector3(0,1,0);
float angle = Random.Range(0,360);
_enmey.transform.Rotate(0,angle,0);
}
}
}


让敌人见到玩家发射火球

第一步:制作一个火球预设体



修改WanderingAI代码,使敌人见到玩家发射一个火球

...
[SerizeField] private GameObject fireballPrefab;
private GameObject _fireball;
...
if(physics.SphereCat(ray,0.75f,out hit))
{
GameObject hitObject = hit.transform.gameObject;
if(hitObject.GetComponent<PlayerCharacter>())//检测是否时玩家
{
if(_fireball == null)//检测是否已经发射火球了
{
_fireball = Instantiate(fireballPrefab) as GameObject;
_fireball.transform.position = transform.TransformPoint(Vector3.forward*1.5f);//把相对与此物体的坐标转化为全局坐标
}
}
else if(hit.distance<obstacleRange)
{
float angle = Random,Range(-110,110);
transform.Rotate(0,angle,0);
}
}
...


第二步:为球体的Sphere Collider组件的I上Trigger复选框勾上,并为其添加Rigidbody刚体,取消UseGravity选项。再添加Fireball脚本给火球

using UnityEngine;
using System.Collections;

public class Fireball : MonoBehaviour {
public float speed = 10.0f;
public int damage = 5;

void Start () {

}

// Update is called once per frame
void Update () {
transform.Translate(0,0,speed*Time.deltaTime);
}

void OnTriggerEnter(Collider other)
{
PlayerCharacter player = other.GetComponent<PlayerCharacter>();
if (player != null)
{
//Debug.Log("Player hit");
player.Hurt(damage);
}
Destroy(this.gameObject);
}
}


第三步:为玩家添加PlayCharacter,来记录和计算玩家受到的伤害

using UnityEngine;
using System.Collections;

public class PlayerCharacter : MonoBehaviour {
private int _health;

void Start () {
_health = 5;
}

public void Hurt(int damage)
{
_health -= damage;
Debug.Log("Health:"+_health);
}
}


注意:很多类和方法不清楚请查看官方文档
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity3d unity 游戏