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

Posted avi9111

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了真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,延时执行下一个连招(如果没连招则结束)

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

 

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

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

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

以上是关于真Unity3d_分享一个攻击连招的简单实现的主要内容,如果未能解决你的问题,请参考以下文章

鬼泣4的操作方法

三国无双 攻略

Unity技能工厂——怎样实现丝滑的角色连击动画

真Unity3d_坐标和矢量入门_UI_3d转2d参考

真Unity3d_亲自做了一次之后,终于发现了为什么那么多烂游戏,那么多新手引导

Unity3D_(网格导航)简单物体自动寻路