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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jessssion/article/details/59715807

制作敌人简单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);
    }
}

注意:很多类和方法不清楚请查看官方文档

阅读更多

没有更多推荐了,返回首页