真Unity3d_分享一个攻击连招的简单实现

从5400公司的源代码里获得灵感,不想独享,分享出来

基本和大公司5400一样,5400公司靠着页游,在2000年最后一波成为大公司。

至今应该还是靠页游赚钱

他们号称2012年开始unity3d开发,这个公开源码也几乎是和2012~2013的游戏源码(发布到Web平台)一样了

修正版II(2019.06.11):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BattleAttackManager :MonoBehaviour{
	public static BattleAttackManager Instance;
	private List<int> preCmds = new List<int>();
	void Awake()
	{
		Instance = this;
	}

	public class SkillInfo
	{
		public int Id;
		public float cd;
	}
	MonoBehaviour owner;
	float lastAttackTime;
	// 公共cd 为 0.2 秒
	public int CommonCD = 500;
	int currSkillId;
	public BattleAttackManager(MonoBehaviour owner) {
		this.owner = owner;

	}
	public void Init(MonoBehaviour owner){
		this.owner = owner;
	}
	public void NormalAttack(int skillId =-1) {

		if (preCmds == null)
			preCmds = new List<int> ();
		//有连招,并且最后的连招能接上当前skillId
//		if (preCmds.Count > 0 && preCmds[preCmds.Count - 1]==skillId-1)
//		{
//			preCmds.Add(skillId);
//			return;
//		}
		if (IsComboCooldown())
		{
			preCmds.Add(skillId);
			return;
		}
		//theOwner.motor.TurnToControlStickDir();
		//Util.MogoUtils.LookAtTargetInRange(theOwner.Transform, 6, 360);
		//(skillManager as PlayerSkillManager).ResetCoolTime(nextskill);

		//EntityMyself.preSkillTime = Time.realtimeSinceStartup;
		//theOwner.CastSkill(nextskill);
		ResetCoolTime(skillId);
		int index = skillId % 100;
		Debug.Log ("Attack 1 preCmds:" + LogString);
		Invoke("NextCmd",1f);
	}
	public string LogString
	{
		get{ 
			string s="";
			for (int i = 0; i < preCmds.Count; i++) {
				s+=preCmds[i] +"-";
			}
			return s;
		}
	}
	public int GetLastCombo() {
		if (preCmds.Count == 0)
			return 0;
		else
			return preCmds[preCmds.Count - 1];
	}
	public bool IsAttackDone()
	{
		return preCmds.Count == 0;
	}
	private void ResetCoolTime(int skillId)
	{
		currSkillId = skillId;
		lastAttackTime = Time.realtimeSinceStartup;
	}
	private bool IsComboCooldown() {

		int attackInterval = (int)((Time.realtimeSinceStartup - lastAttackTime) * 1000);

		if (attackInterval < CommonCD) {
			Debug.Log ("common attack cool down time");
			return true;
		} else {
			Debug.Log ("cd check=" + attackInterval + "|" + CommonCD);
		}
		return false;
	}
	public void NextCmd()
	{
		if (preCmds.Count == 0)
		{
			return;
		}
		int skillId = preCmds[0];
		preCmds.RemoveAt(0);
		NormalAttack(skillId);
	}
}

测试方法:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GUIButton : MonoBehaviour
{
	void Start(){

		BattleAttackManager.Instance.Init (this);
	}
	void OnGUI()
	{

		if (GUILayout.Button ("Attack")) {
			//Debug.Log ("Atta");
			BattleAttackManager.Instance.NormalAttack();
		}
	}
}

只要随便新建衣蛾Enpty GameObject,把测试脚本和BattleAttackManager脚本挂上即可

这个源码已经能直接复制粘贴用,部分注析,或者自己扩展开发即可

但是基本原理确是杠杠的

5400公司原来的计时器TimerHeap 封装了,源码看的到,没有做反编

我扩展开发,提唤醒用了Invoke 做计时器

但扩展开发整个连招,基本原理也就是基于5400公司的源码:

【开始】

普通攻击 ->有CD则缓存

               ->没有CD则执行攻击 ->并根据CD,延时执行下一个连招(如果没连招则结束)

               ---- 延时执行,执行连招 -> 链接到一开始的普通攻击(不停循环往复)

 

就这么简单的实现了一个闭包,达到连续普通攻击

整个代码可以搬到任何地方用,也就算是比较好的封装性,也具备健壮性,和扩展性

这方法可能一般的培训机构也会教,这是实践得出的结论,而且简单的很。(普通的大学反而不会教),值得学习和深思

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

avi9111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值