unity 战斗系统设计(条件触发篇)

战斗系统设计之(条件触发篇)
1.战斗里面的数值需要发生改变必须需要满足条件才会触发。这里就涉及到条件触发系统。
a.通用数值条件判断

using System;

public enum RangeType
{ 
    Less = 0,//小于
    LessOrEqual = 1,//小于等于
    Equal = 2,//等于
    Range  = 3,//在范围内
    Abs = 4,   //绝对值
    GreaterOrEqual = 5,//大于等于
    Greater = 6,//大于
}

public class CommonRanger 
{
    public float Value;
    public float Min;
    public float Max;

    public RangeType RangeType;

    public CommonRanger(RangeType pRangeType, float pValue, float pMinValue = 0, float pMaxValue = 0)
    {
        RangeType = pRangeType;
        Value = pValue;
        Min = pMinValue;
        Max = pMaxValue;
    }

    public bool InRange(float pTarget)
    {
        if (RangeType == RangeType.Less)
        {
            return pTarget < Value;
        }
        else if (RangeType == RangeType.LessOrEqual)
        {
            return pTarget <= Value;
        }
        else if (RangeType == RangeType.Equal)
        {
            return pTarget == Value;
        }
        else if (RangeType == RangeType.Range)
        {
            return pTarget >= Min && pTarget <= Max;
        }
        else if (RangeType == RangeType.GreaterOrEqual)
        {
            return pTarget >= Value;
        }
        else if (RangeType == RangeType.Abs)
        {
            var abs = Math.Abs(pTarget - Value);
            return abs <= Max && abs >= Min;
        }
        else if (RangeType == RangeType.Greater)
        {
            return pTarget > Value;
        }
        return false;
    }
}

b.基础条件类:

public class VConditioner
{
	protected bool isPass = false;
	public ConditionerType type = ConditionerType.None;
	public int BodyId;
	public System.Action<float> passCB;
	protected CommonRanger ranger;
	protected SVType vType;
	private bool _isLoad = false;
	protected SVBase selfVBase_;
	public VConditioner(){ }
	public VConditioner(int pBodyId)
	{
		BodyId = pBodyId;
	}
	public void SetRanger(CommonRanger pRanger)
	{
		ranger = pRanger;
	}
	public void SetPassCB(System.Action<float> pPassCB)
	{
		passCB = pPassCB;
	}
	public void Load(){
		if (_isLoad)
			return;
		_isLoad = true;
		OnLoad();
	}
	public void UnLoad(){OnUnload();}
	protected virtual void OnLoad(){
		selfVBase_ = Word.Instance.GetValue(BodyId, vType);
	}
	public virtual void OnCheckPass(float pTime)
	{
		if (selfVBase_ != null)
		{
			var _value = selfVBase_.GetValue(pTime);
			isPass = ranger.InRange(_value);
		}
	}
	protected virtual void OnUnload(){ }
	protected void OnPass(float pTime){
		if (isPass)
		{
			passCB.Invoke(pTime);
		}
	}
	public bool IsPass() { return isPass; }
}

c. 举例扩展cd 条件

public class VCDConditioner : VConditioner
{
	private float cd_;
	private float nextRTime;
	public VCDConditioner(int pBodyId,float pCD = 1)
	{
		BodyId = pBodyId;
		cd_ = pCD;
	}
	public override void OnCheckPass(float pTime)
	{
		if (pTime >= nextRTime)
		{
			isPass = true;
			nextRTime = pTime + cd_;
		}
		else
		{
			isPass = false;
		}
	}
}

d.举例扩展死亡条件

public class VDeadConditioner : VConditioner
{
	public VDeadConditioner(int pBodyId)
	{
		BodyId = pBodyId;
		SetRanger(new CommonRanger(RangeType.Less, 1));
		vType = SVType.Hp;
	}
}

2.触发条件
a.基础触发类:

using System.Collections.Generic;

public class VTrigger 
{
	private Dictionary<ConditionerType, List<VConditioner>> map = new Dictionary<ConditionerType, List<VConditioner>>();
	private List<VConditioner> list = new List<VConditioner>();

	private bool isTrigger = false;
	public bool Enable = false;
	private System.Action<float> triggerAc;
	public int BodyId;
	public VTrigger() { }
	public VTrigger(int pBodyId)
	{
		BodyId = pBodyId;
	}

	public void SetTriggerAction(System.Action<float> pAc)
	{
		triggerAc = pAc;
	}
	public void Load()
	{
		OnLoad();
		foreach (var item in list)
		{
			item.SetPassCB(OnOnePass);
		}
		foreach (var item in list)
		{
			item.Load();
		}
	}
	protected void AddVconditioner(VConditioner pVConditioner)
	{
		if (map.ContainsKey(pVConditioner.type))
		{
			map[pVConditioner.type].Add(pVConditioner);
		}
		else
		{
			map.Add(pVConditioner.type ,new List<VConditioner>() { pVConditioner });
		}
		list.Add(pVConditioner);
	}
	protected virtual void OnLoad(){}
	private void OnOnePass(float pTime)
	{
		CheckAllPass(pTime);
	}
	private void CheckAllPass(float pTime)
	{
		if (IsAllPass(pTime))
		{
			isTrigger = true;
			if (triggerAc != null)
			{
				triggerAc.Invoke(pTime);
			}
		}
	}
	public bool IsAllPass(float pTime)
	{
		foreach (var temp in list)
		{
			temp.OnCheckPass(pTime);
			var isPass = temp.IsPass();
			if (!isPass)
				return false;
		}
		return true;
	}
}

b.举例扩展死亡触发器

public class VDeadTrigger : VTrigger
{
	public VDeadTrigger(int pBodyId)
	{
		BodyId = pBodyId;
	}
	protected override void OnLoad()
	{
		VDeadConditioner dead = new VDeadConditioner(BodyId);
		AddVconditioner(dead);
	}
}
编写 Unity战斗框架需要考虑多个方面,包括战斗场景设计、角色属性管理、技能系统、伤害计算等等。以下是一个简单的战斗框架的实现步骤: 1. 设计战斗场景。根据游戏需求设计战斗场景,并在 Unity 中创建相应的场景。 2. 创建角色。在 Unity 中创建角色,包括角色的模型、动画和属性等。根据游戏需求选择不同的角色类型,例如战斗士兵、法师、弓箭手等。 3. 管理角色属性。为每个角色添加属性组件,包括生命值、攻击力、防御力等。在角色受到攻击时,根据攻击者的属性计算出受到的伤害值,然后减去生命值。 4. 设计技能系统。在 Unity 中创建技能系统,包括技能的触发条件、技能的效果和技能的消耗等。根据游戏需求设计出不同的技能类型,例如攻击技能、防御技能、治疗技能等。 5. 触发技能。在角色受到攻击或者主动释放技能时,触发相应的技能效果。根据技能的触发条件和效果,在角色身上添加相应的状态,例如冰冻、昏迷、中毒等。 6. 计算伤害。在技能效果中计算伤害值,并减去目标角色的生命值。根据游戏需求设计出不同的伤害计算方式,例如基于攻击力和防御力的计算、基于元素属性的计算等。 7. 处理战斗结果。在战斗结束时,根据游戏规则计算出胜负结果,并展示相应的结算界面。 以上是一个简单的战斗框架的实现步骤。在实际开发中,还需要考虑各种异常情况的处理和优化性能等问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值