开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:678

当前位置:游戏蛮牛 技术专区 教程分享

查看: 449|回复: 2

[自学总结] 事件执行 之 角色死亡

[复制链接]  [移动端链接]
5熟悉之中
634/1000
排名
6073
昨日变化
7

11

主题

133

帖子

634

积分

Rank: 5Rank: 5

UID
152229
好友
0
蛮牛币
2459
威望
0
注册时间
2016-6-16
在线时间
286 小时
最后登录
2017-9-24
发表于 2016-12-20 10:37:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
一般在游戏里总有玩家,敌人,物品,都会有死亡或者是消失的控制,我一般采用的是HP来控制他们的死亡或者消失
以前一直采用Update的方法实时检测HP的值判断是否该死亡或者消失,现在用类继承事件来控制
定义一个角色类
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;

public class RoleInfo : MonoBehaviour
{
    //@brief 所有角色的死亡注册这个事件即可
    public delegate void DeadHandler(); 
    public event DeadHandler Dead;
    //@brief 血量
    private int hp = 100;
    //brief 角色只死亡一次
    public bool isLive = true;
    public int HP
    {
        get
        {
            if (hp <= 0 && isLive)
            {
                Dead();
                isLive = false;
                return 0;
            }
            return hp;
        }

        set { hp = hp <= 0 ? 0 : value; }
    }
}

现在就来测试一下这个类
定义一个玩家类,继承RoleInfo
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;

public class Player : RoleInfo
{
    //brief 模拟角色血量减少
    private float time = 0;
    //brief 角色的最大生命值
    public int MaxHP = 300;

    void Awake()
    {
        //给角色的生命值赋值
        HP = MaxHP;
    }
    void Start()
    {
        //注册当血量小于等于0时,角色死亡的方法
        Dead += Player_Dead;
    }
    /// <summary>
    /// 角色死亡的方法
    /// </summary>
    private void Player_Dead()
    {
        //执行死亡动画
        //执行死亡音效等
        Debug.Log(gameObject.name + "已经死亡");
    }

    void Update()
    {
        //模拟角色血量减少
        time += Time.deltaTime;
        if (time >= 0.1f)
        {
            time = 0;
            Debug.Log("HP:" + HP);
            HP-=5;
        }
    }

    void OnDisable()
    {
        //有注册方法,就有取消注册方法
        Dead -= Player_Dead;
    }
}


还可以定义一个敌人类,也继承RoleInfo
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;

public class Emeny01 : RoleInfo
{
    //brief 模拟角色血量减少
    private float time = 0;
    //brief 角色的最大生命值
    public int MaxHP = 300;

    void Awake()
    {
        //给角色的生命值赋值
        HP = MaxHP;
    }
    void Start()
    {
        //注册当血量小于等于0时,角色死亡的方法
        Dead += Player_Dead;
    }
    /// <summary>
    /// 角色死亡的方法
    /// </summary>
    private void Player_Dead()
    {
        //执行死亡动画
        //执行死亡音效等
        Debug.Log(gameObject.name + "已经死亡");
    }

    void Update()
    {
        //模拟角色血量减少
        time += Time.deltaTime;
        if (time >= 0.1f)
        {
            time = 0;
            Debug.Log("HP:" + HP);
            HP-=5;
        }
    }

    void OnDisable()
    {
        //有注册方法,就有取消注册方法
        Dead -= Player_Dead;
    }
}


这里还可以定义很多个敌人或者玩家都继承RoleInfo,只要注册死亡方法,而且每个类里的除了自己死亡时执行的信息不同,其它的都可以复用
下面就可以将脚本挂在物体上进行测试
QQ图片20161220103724.png


回复

使用道具 举报

5熟悉之中
791/1000
排名
5046
昨日变化

4

主题

343

帖子

791

积分

Rank: 5Rank: 5

UID
187912
好友
5
蛮牛币
2410
威望
0
注册时间
2016-11-29
在线时间
210 小时
最后登录
2017-9-20
QQ
发表于 2016-12-20 11:56:51 | 显示全部楼层
很好的帖子,感谢楼主的分享

回复 支持 反对

使用道具 举报

排名
31673
昨日变化
33

0

主题

46

帖子

76

积分

Rank: 2Rank: 2

UID
160799
好友
0
蛮牛币
13
威望
0
注册时间
2016-8-5
在线时间
24 小时
最后登录
2017-9-23
发表于 2017-7-5 14:09:56 | 显示全部楼层
6666666666666666666666

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表