真Unity3d

    xiaoxiao2022-07-06  191

    从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,延时执行下一个连招(如果没连招则结束)

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

     

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

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

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

    最新回复(0)