当前位置: 首页 > news >正文

哪个旅游网站规划好免费企业官网怎么做

哪个旅游网站规划好,免费企业官网怎么做,网站建设开发企业,免费照片编辑器提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作游戏的金钱系统吉欧Geo以及HUD Camera 1.制作金钱系统吉欧2.制作吉欧的脚本Geo Counter逻辑处理3.制作HUD Canvas的吉欧的UI4.在敌人的HealthManager.c… 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档 文章目录 前言一、制作游戏的金钱系统吉欧Geo以及HUD Camera 1.制作金钱系统吉欧2.制作吉欧的脚本Geo Counter逻辑处理3.制作HUD Canvas的吉欧的UI4.在敌人的HealthManager.cs脚本中添加上吉欧的逻辑处理二、制作HUD Canvas的初始的额外内容总结 前言 hello大家好久没见之所以隔了这么久才更新并不是因为我又放弃了这个项目而是接下来要制作的工作太忙碌了每次我都花了很长的时间解决完一个部分然后就没力气打开CSDN写文章就直接睡觉去了而且还有就是我上一期写了一万字的内容结果系统出BUG给我没保存直接气晕了现在刚刚醒来终于有时间整理下我新制作的内容了还有就是感谢兄弟们的评论支持看到你的评论我决定还是接着制作这个系列的内容。 那么这个HUD是什么意思呢百度翻译就是平行显示系统一般用于车辆上面的某个系统但它也可以作为了一个专业的游戏术语显示与摄像机平行的东西如果你还没理解的话我就直接上图吧就是这些不会随着摄像机移动而相对移动的物品这些看似是UI来实现的也可以使用摄像机的功能来实现 然后这一期我们来制作金钱系统吉欧Geo和初步制作HUD Canvas的额外内容 一、制作游戏的金钱系统吉欧Geo以及HUD Camera 1.制作金钱系统吉欧Geo 为了贴近游戏一点我们就不称金钱系统了直接就叫吉欧得了然后它的英文名叫Geo阅读这篇文章先要注意一下这点。 OK我们先来制作tk2dSprtite和tk2dspriteAnimator先把素材导入吧 接下来是制作动画这里需要注意名字不要打错一会脚本还要用 2.制作吉欧的脚本Geo Counter逻辑处理 创建一个新的游戏对象就叫Geo Small然后就是经典四件套组件 先来讲讲它的子对象Bug这个就是那个捡钱的护符当我们暂时还用不到创建好先放一边了 接下来这个子对象Acid Steam的粒子系统就是当钱掉进水里后的粒子系统 接下来来看看脚本Geo Control.cs游戏中三种面值的Geo分别small,med,large,它们代表的面值分别是1,5,25。 using System; using System.Collections; using System.Collections.Generic; using UnityEngine;public class GeoControl : MonoBehaviour {public Size[] sizes new Size[]{new Size(Small Idle, Small Air, 1),new Size(Med Idle, Med Air, 5),new Size(Large Idle, Large Air, 25)};public int type;private Size size;[Space]public AudioClip[] pickupSounds;[Space]public ParticleSystem acidEffect;public GameObject getterBug;private Coroutine getterRoutine;private HeroController hero;private Transform player;private bool activated;private bool attracted; //是否触发捡钱吸入到玩家上private const float pickupStartDelay 0.25f;private float pickupStartTime;private float defaultGravity;private tk2dSpriteAnimator anim;private AudioSource audioSource;private Renderer rend;private Rigidbody2D body;private BoxCollider2D boxCollider;private SpriteFlash spriteFlash;private void Awake(){anim GetComponenttk2dSpriteAnimator();audioSource GetComponentAudioSource();rend GetComponentRenderer();body GetComponentRigidbody2D();boxCollider GetComponentBoxCollider2D();spriteFlash GetComponentSpriteFlash();defaultGravity body.gravityScale;}private void Start(){hero HeroController.instance;}private void OnEnable(){SetSize(type);transform.SetPositionZ(UnityEngine.Random.Range(0.001f, 0.002f));activated false;attracted false;body.gravityScale defaultGravity;if (rend){rend.enabled true;}if (getterBug){getterBug.SetActive(false);}if (acidEffect){acidEffect.gameObject.SetActive(false);}boxCollider.isTrigger false;if (GameManager.instance.sceneName Crossroads_38){return;} //判断玩家是否装备了捡钱的护符if (GameManager.instance.GetPlayerDataBool(equippedCharm_1)){getterRoutine StartCoroutine(Getter());}pickupStartTime Time.time pickupStartDelay;}private void FixedUpdate(){if (attracted){Vector2 vector new Vector2(hero.transform.position.x - transform.position.x, hero.transform.position.y - 0.5f - transform.position.y);vector Vector2.ClampMagnitude(vector, 1f);vector new Vector2(vector.x * 150f, vector.y * 150f);body.AddForce(vector);Vector2 vector2 body.velocity;vector2 Vector2.ClampMagnitude(vector2, 20f);body.velocity vector2;}}private void SetSize(int index){if (index sizes.Length){index sizes.Length - 1;}else if (index 0){index 0;}size sizes[index];if (anim){anim.Play(size.airAnim);}}private IEnumerator Getter(){yield return new WaitForSeconds(UnityEngine.Random.Range(1f, 1.7f));if (getterBug){//插值执行捡钱虫子开始时淡入淡出效果getterBug.SetActive(true);Vector3 destination new Vector3(-0.06624349f, 0.1932119f, -0.001f);Vector3 source destination new Vector3(UnityEngine.Random.Range(-1f, 1f), UnityEngine.Random.Range(0.5f, 1.5f), 0f);float easeTime UnityEngine.Random.Range(0.3f, 0.5f);for (float timer 0f; timer easeTime; timer Time.deltaTime){float t Mathf.Sin(timer / easeTime * 1.5707964f);getterBug.transform.localPosition Vector3.Lerp(source, destination, t);yield return null;}getterBug.transform.localPosition destination;boxCollider.isTrigger true;body.gravityScale 0f;attracted true; //然后激活attracted让虫子和钱朝着玩家的方向移动destination default(Vector3);source default(Vector3);}}/// summary/// 当吉欧碰到地面上/// /summary/// param namecollision/paramprivate void OnCollisionEnter2D(Collision2D collision){if (anim){tk2dSpriteAnimationClip clipByName anim.GetClipByName(size.idleAnim);if(clipByName ! null){anim.PlayFromFrame(clipByName, UnityEngine.Random.Range(0, clipByName.frames.Length));}}}private void OnTriggerEnter2D(Collider2D collision){if (activated || Time.time pickupStartTime){return;}bool flag false;float num 0f;if(collision.tag HeroBox) //如果碰到玩家了就加钱{Debug.LogFormat(size.value size.value);hero.AddGeo(size.value);num Mathf.Max(num, PlayCollectSound());flag true;}else if (collision.tag Acid) //如果掉到酸水里了就播放特效{if (acidEffect){acidEffect.gameObject.SetActive(true);num Mathf.Max(num, acidEffect.main.duration acidEffect.main.startLifetime.constant);}flag true;}if (flag) //暂停捡钱的虫子的routine销毁该物体{if (getterRoutine ! null){StopCoroutine(getterRoutine);}Disable(num);}}/// summary/// 获取随机一个音频的播放时间/// /summary/// returns/returnsprivate float PlayCollectSound(){if (audioSource pickupSounds.Length ! 0){AudioClip audioClip pickupSounds[UnityEngine.Random.Range(0, pickupSounds.Length)];if (audioClip){audioSource.PlayOneShot(audioClip);return audioClip.length;}Debug.LogError(GeoControl encountered missing audio!, this);}return 0f;}/// summary/// 关闭捡钱和自身的renderer/// /summary/// param namewaitTime/paramprivate void Disable(float waitTime){activated true;if (rend){rend.enabled false;}if (getterBug){getterBug.SetActive(false);}StartCoroutine(DisableAfterTime(waitTime));}private IEnumerator DisableAfterTime(float waitTime){yield return new WaitForSeconds(waitTime);gameObject.Recycle();}public void SetFlashing(){if (spriteFlash){spriteFlash.GeoFlash();}}[Serializable]public struct Size{public string idleAnim;public string airAnim;public int value;public Size(string idleAnim, string airAnim, int value){this.idleAnim idleAnim;this.airAnim airAnim;this.value value;}} }然后我们来制作三个面值的吉欧首先是最小的small它的type设置为0注意动画名字的tk2dspriteanimator保持一致 然后是5块钱面值的中型吉欧记得改下碰撞箱的大小和type类型 最后是最大面值的吉欧。  回到HeroController.cs中创建新的方法 public void AddGeo(int amount){playerData.AddGeo(amount);geoCounter.AddGeo(amount);}public void AddGeoQuietly(int amount){playerData.AddGeo(amount);}public void ToZero(){geoCounter.ToZero();}public void AddGeoToCounter(int amount){geoCounter.AddGeo(amount);}public void TakeGeo(int amount){playerData.TakeGeo(amount);geoCounter.TakeGeo(amount);}public void UpdateGeo(){geoCounter.UpdateGeo();} 先看PlayerData.cs这边说白了我们就是存储了两个int类型和一个bool类型并打算在HUD屏幕上显示我们拥有的Geo数量。 public int geo; //玩家拥有的吉欧public int geoPool; //玩家死后存储死前拥有的吉欧public bool firstGeo; //是否是得到的第一块钱public void AddGeo(int amount){geo amount;if (geo 9999999){geo 9999999;}}public void TakeGeo(int amount){geo - amount;}那么这个脚本GeoCounter.cs是什么呢自然就是我们下一部分的内容HUD Canvas上的吉欧的UI! 3.制作HUD Canvas的吉欧的UI 在HUD Canvas下我们创建一个新的对象Geo Counter 它只有几个子对象首先是吉欧的图标Geo Sprite 先来讲讲它的两个playmakerFSM  这个playmakerFSM 上几期都讲过了就不浪费时间了。 再来看看另一个playmakerFSMGeo Sprite先添加上事件和变量 第一个状态就是初始化先记录自己一开始的位置判断是否是firstGeo 如果是的话就进入First Geo Uncollected状态获取自己的父对象以及对对象Geo Text发送事件DOWN 然后设置playerdata的bool变量firstGeo为true播放动画Coin Appear向Geo Text发送事件UP   回到Init状态如果不是我们就来判断是否完成初始化还有是否是第一次游玩游戏isFirstGame这个我们在上一期讲生命的时候也提到过。 如果没有完成初始化或者是第一次游玩游戏那么就进入pause状态初始化变量以及向geo text发送事件DOWN INSTANT等个4秒进入下一个状态 这个和First Get状态的内容差不多  来到Idle状态设置自身回到初始位置播放动画Coin Get开启自身renderer。  它身上有两个事件都是通过脚本GeoCotontrol.cs来发送的所以我们先看看其它状态如果发送TAKE事件进入take状态 花钱了话就通过行为Object Jitter.cs来进行丝滑的移动动画 using UnityEngine;namespace HutongGames.PlayMaker.Actions {[ActionCategory(ActionCategory.Transform)][Tooltip(Jitter an object around using its Transform.)]public class ObjectJitter : RigidBody2dActionBase{[RequiredField][Tooltip(The game object to translate.)]public FsmOwnerDefault gameObject;[Tooltip(Jitter along x axis.)]public FsmFloat x;[Tooltip(Jitter along y axis.)]public FsmFloat y;[Tooltip(Jitter along z axis.)]public FsmFloat z;[Tooltip(If true, dont jitter around start pos)]public FsmBool allowMovement;private float startX;private float startY;private float startZ;public override void Reset(){gameObject null;x new FsmFloat{UseVariable true};y new FsmFloat{UseVariable true};z new FsmFloat{UseVariable true};}public override void OnPreprocess(){Fsm.HandleFixedUpdate true;}public override void OnEnter(){GameObject ownerDefaultTarget base.Fsm.GetOwnerDefaultTarget(gameObject);if (ownerDefaultTarget null){return;}startX ownerDefaultTarget.transform.position.x;startY ownerDefaultTarget.transform.position.y;startZ ownerDefaultTarget.transform.position.z;}public override void OnFixedUpdate(){DoTranslate();}private void DoTranslate(){GameObject ownerDefaultTarget Fsm.GetOwnerDefaultTarget(gameObject);if (ownerDefaultTarget null){return;}if (allowMovement.Value){ownerDefaultTarget.transform.Translate(Random.Range(-x.Value, x.Value), Random.Range(-y.Value, y.Value), Random.Range(-z.Value, z.Value));return;}Vector3 position new Vector3(startX Random.Range(-x.Value, x.Value), startY Random.Range(-y.Value, y.Value), startZ Random.Range(-z.Value, z.Value));ownerDefaultTarget.transform.position position;}} }using UnityEngine;namespace HutongGames.PlayMaker.Actions {[ActionCategory(ActionCategory.Transform)][Tooltip(Jitter an object around using its Transform.)]public class ObjectJitterLocal : FsmStateAction{[RequiredField][Tooltip(The game object to translate.)]public FsmOwnerDefault gameObject;[Tooltip(Jitter along x axis.)]public FsmFloat x;[Tooltip(Jitter along y axis.)]public FsmFloat y;[Tooltip(Jitter along z axis.)]public FsmFloat z;private float startX;private float startY;private float startZ;public override void Reset(){gameObject null;x new FsmFloat{UseVariable true};y new FsmFloat{UseVariable true};z new FsmFloat{UseVariable true};}public override void OnPreprocess(){Fsm.HandleFixedUpdate true;}public override void OnEnter(){GameObject ownerDefaultTarget Fsm.GetOwnerDefaultTarget(gameObject);if (ownerDefaultTarget null){return;}startX ownerDefaultTarget.transform.localPosition.x;startY ownerDefaultTarget.transform.localPosition.y;startZ ownerDefaultTarget.transform.localPosition.z;}public override void OnFixedUpdate(){DoTranslate();}private void DoTranslate(){GameObject ownerDefaultTarget Fsm.GetOwnerDefaultTarget(gameObject);if (ownerDefaultTarget null){return;}Vector3 localPosition new Vector3(startX Random.Range(-x.Value, x.Value), startY Random.Range(-y.Value, y.Value), startZ Random.Range(-z.Value, z.Value));ownerDefaultTarget.transform.localPosition localPosition;}} }当关卡变换的时候就会发送LEVEL LOADED事件这里我不知道我前面讲过没还有就是IDLE事件也是Geo Control.cs发送的。 接下来这两个事件都是会在玩家死亡后发送的所以当我讲到那一期的时候就会用到这两个事件 然后TO ZERO事件作为一个全球传送Global Transition发送到Lose状态 SHATTER事件也是作为一个全球传送Global Transition发送到Shatter状态 关闭掉自身的renderer的同时发送Geo Text的DOWN事件  当进入新的关卡也就是回到复活场景的时候发geo text的UP事件  来到另一个子对象Geo Text这里我们用的组件是Text Mesh:注意设置好Material类型还有字体大小Font Size,它的playmakerFSM也是color_fader,之前讲过了就不谈了直接复制粘贴就完事了 另一个子对象就是Add Text说明白了就是加钱的效果它也有个text mesh然后它的playmakerFSM也是很简单  Down状态就是用Ease渐变的方式设置material的color和它的alpha值为0  UP状态就是完全反过来。 最后一个Subtract Text就是花钱的效果动画和上面同理这里就不多bb了 回到父对象Geo Counter来我还漏了一个忘了讲就是设置一个playmaker的全球变量Geo Counter然后新建一个playmakerFSM让全球变冷指向自己 最后我们终于可以讲讲传说中的脚本GeoCounter.cs了这段代码有点难理解我这里简单解释一下吧首先增加吉欧和减少吉欧都分为两个int类型的阶段表示分别是addRollerState和takeRollerState当它们的state为0的时候就什么都不做当state为1的时候就延迟准备进入各自的动画逻辑处理状态当state为2的时候进入逻辑处理状态播放动画发送事件更改textmesh的text等等。。。然后我们在第一部分讲到AddGeo和TakeGeo都是切换不同的状态以及更改changePerTick的值。 using System; using UnityEngine;public class GeoCounter : MonoBehaviour {private const float ROLLER_START_PAUSE 1.5f;private const float DIGIT_CHANGE_TIME 0.025f;[HideInInspector]public PlayerData playerData;public GameObject geoSprite;public TextMesh geoTextMesh;public TextMesh subTextMesh;public TextMesh addTextMesh;private PlayMakerFSM geoSpriteFsm;private PlayMakerFSM addTextFsm;private PlayMakerFSM subTextFsm;private int counterCurrent; //当前拥有的吉欧private int geoChange; //需要改变的geo数量private int addCounter;//需要增加的吉欧的计数器private int takeCounter;//需要减少的吉欧的计数器private int addRollerState; //增加吉欧的动画的阶段private int takeRollerState;//减少吉欧的动画的阶段private int changePerTick; //每次执行tick动画减少的吉欧数量private float addRollerStartTimer; //开始增加吉欧前的计时器private float takeRollerStartTimer;//开始减少吉欧前的计时器private float digitChangeTimer; //每次当这个变量digitChangeTimer小于0的时候就播放一次加钱的动画private bool toZero; //将吉欧归零private void Awake(){geoSpriteFsm FSMUtility.GetFSM(geoSprite);subTextFsm FSMUtility.GetFSM(subTextMesh.gameObject);addTextFsm FSMUtility.GetFSM(addTextMesh.gameObject);}private void Start(){playerData PlayerData.instance;counterCurrent playerData.geo;geoTextMesh.text counterCurrent.ToString();}private void Update(){if (toZero){if(digitChangeTimer 0f){digitChangeTimer - Time.deltaTime;return;}if(counterCurrent 0){counterCurrent changePerTick;if (counterCurrent 0){counterCurrent 0;geoSpriteFsm.SendEvent(SHATTER);toZero false;}geoTextMesh.text counterCurrent.ToString();digitChangeTimer DIGIT_CHANGE_TIME;return;}}else{if (addRollerState 1) //延迟进入吉欧增加的状态{if (addRollerStartTimer 0f){addRollerStartTimer - Time.deltaTime;}else{addRollerState 2;}}if (addRollerState 2 addCounter 0) //进入吉欧增加的动画切要保证增加的吉欧数量大于0{geoSpriteFsm.SendEvent(GET);if (digitChangeTimer 0f){addCounter - changePerTick;//这里的changePerTick应该是正数最小不小于-1counterCurrent changePerTick;geoTextMesh.text counterCurrent.ToString();if (addTextMesh ! null){addTextMesh.text addCounter.ToString();}if (addCounter 0)//如果累计增加的addCounter小于等于0以后就说明状态执行完毕已完成整个增加吉欧的行为就回到addRollerState 0状态{geoSpriteFsm.SendEvent(IDLE);addCounter 0;addTextMesh.text 0;addRollerState 0;counterCurrent playerData.geo;geoTextMesh.text counterCurrent.ToString();addTextFsm.SendEvent(DOWN);}digitChangeTimer DIGIT_CHANGE_TIME;}else{digitChangeTimer - Time.deltaTime;}}if (takeRollerState 1)//延迟进入吉欧减少的状态{if (takeRollerStartTimer 0f){takeRollerStartTimer - Time.deltaTime;}else{takeRollerState 2;}}if (takeRollerState 2 takeCounter 0)//进入吉欧减少的动画状态切要保证减少的吉欧数量大于0{geoSpriteFsm.SendEvent(TAKE); //向geoSpriteFsm发送事件TAKEif (digitChangeTimer 0f) //每一次digitChangeTimer的时间小于0的时候就改变changePerTick数量的takeCounter和counterCurrent{takeCounter - changePerTick; //这里的changePerTick应该是负数最多不大于-1counterCurrent changePerTick;geoTextMesh.text counterCurrent.ToString();if (subTextMesh ! null){subTextMesh.text - (-takeCounter).ToString();}if (takeCounter 0) //如果累计减少的takeCounter大于等于0以后就说明状态执行完毕已完成整个减少吉欧的行为就回到takeRollerState 0状态{geoSpriteFsm.SendEvent(IDLE);takeCounter 0;subTextMesh.text - 0;takeRollerState 0;counterCurrent playerData.geo;geoTextMesh.text counterCurrent.ToString();subTextFsm.SendEvent(DOWN);}digitChangeTimer DIGIT_CHANGE_TIME;return;}digitChangeTimer - Time.deltaTime;}}}public void UpdateGeo(){}/// summary/// 该函数在playmakerFSM的LEVEL LOADED事件接收者Reset Coutner状态调用用于场景切换/// /summarypublic void NewSceneRefresh(){counterCurrent playerData.geo;geoTextMesh.text counterCurrent.ToString();toZero false;takeRollerState 0;addRollerState 0;}//以下都是在HeroController.cs代码中被调用顾名思义的都是public void AddGeo(int geo){geoSpriteFsm.SendEvent(CHECK FIRST);if(takeRollerState 0){geoChange geo;addCounter geoChange;takeRollerState 0;geoSpriteFsm.SendEvent(IDLE);subTextFsm.SendEvent(DOWN);counterCurrent playerData.geo -addCounter;geoTextMesh.text counterCurrent.ToString();}if (addRollerState 0){geoChange geo;addCounter geoChange;addTextFsm.SendEvent(UP);addTextMesh.text addCounter.ToString();addRollerStartTimer ROLLER_START_PAUSE;addRollerState 1;}else if (addRollerState 1){geoChange geo;addCounter geoChange;addTextMesh.text addCounter.ToString();addRollerStartTimer ROLLER_START_PAUSE;}else if (addRollerState 2){geoChange geo;addCounter geoChange;geoSpriteFsm.SendEvent(IDLE);counterCurrent playerData.geo;geoTextMesh.text counterCurrent.ToString();addTextMesh.text addCounter.ToString();addRollerState 1;addRollerStartTimer ROLLER_START_PAUSE;}changePerTick (int)(addCounter * DIGIT_CHANGE_TIME * 1.75);if (changePerTick 1){changePerTick 1;}}public void TakeGeo(int geo){if (addRollerState 0){geoChange -geo;takeCounter geoChange;addRollerState 0;geoSpriteFsm.SendEvent(IDLE);addTextFsm.SendEvent(DOWN);counterCurrent playerData.geo -takeCounter;geoTextMesh.text counterCurrent.ToString();}if (takeRollerState 0){geoChange -geo;takeCounter geoChange;subTextFsm.SendEvent(UP);subTextMesh.text - (-takeCounter).ToString();takeRollerStartTimer ROLLER_START_PAUSE;takeRollerState 1;}else if (takeRollerState 1){geoChange -geo;takeCounter geoChange;subTextMesh.text - (-takeCounter).ToString();takeRollerStartTimer ROLLER_START_PAUSE;}else if (takeRollerState 2){geoChange -geo;takeCounter geoChange;geoSpriteFsm.SendEvent(IDLE);counterCurrent playerData.geo;geoTextMesh.text counterCurrent.ToString();subTextMesh.text - (-takeCounter).ToString();takeRollerState 1;takeRollerStartTimer ROLLER_START_PAUSE;}changePerTick (int)((double)((float)takeCounter * DIGIT_CHANGE_TIME) * 1.75);if (changePerTick -1){changePerTick -1;}}public void ToZero(){if(counterCurrent 0){geoSpriteFsm.SendEvent(SHATTER);return;}changePerTick -(int)((float)counterCurrent * DIGIT_CHANGE_TIME * 1.75f);if(changePerTick -1){changePerTick -1;}geoSpriteFsm.SendEvent(TO ZERO);toZero true;} }顺便更下静态脚本FSMUtility这个脚本是更方便的使用playmakerFSM内置的一些方法我之前讲过但太久没更新了我就把最新版的贴出来。   using System; using System.Collections.Generic; using HutongGames.PlayMaker; using UnityEngine;public static class FSMUtility {private static ListListPlayMakerFSM fsmListPool;private const int FsmListPoolSizeMax 20;static FSMUtility(){fsmListPool new ListListPlayMakerFSM();}public static PlayMakerFSM LocateFSM(GameObject go, string fsmName){if (go null){return null;}ListPlayMakerFSM list ObtainFsmList();go.GetComponentsPlayMakerFSM(list);PlayMakerFSM result null;for (int i 0; i list.Count; i){PlayMakerFSM playMakerFSM list[i];if (playMakerFSM.FsmName fsmName){result playMakerFSM;break;}}ReleaseFsmList(list);return result;}private static ListPlayMakerFSM ObtainFsmList(){if (fsmListPool.Count 0){ListPlayMakerFSM result fsmListPool[fsmListPool.Count - 1];fsmListPool.RemoveAt(fsmListPool.Count - 1);return result;}return new ListPlayMakerFSM();}public static bool ContainsFSM(GameObject go, string fsmName){if (go null){return false;}ListPlayMakerFSM list ObtainFsmList();go.GetComponentsPlayMakerFSM(list);bool result false;for (int i 0; i list.Count; i){if (list[i].FsmName fsmName){result true;break;}}ReleaseFsmList(list);return result;}private static void ReleaseFsmList(ListPlayMakerFSM fsmList){fsmList.Clear();if (fsmListPool.Count FsmListPoolSizeMax){fsmListPool.Add(fsmList);}}public static PlayMakerFSM GetFSM(GameObject go){return go.GetComponentPlayMakerFSM();}public static GameObject GetSafe(this FsmOwnerDefault ownerDefault, FsmStateAction stateAction){if (ownerDefault.OwnerOption OwnerDefaultOption.UseOwner){return stateAction.Owner;}return ownerDefault.GameObject.Value;}public static void SendEventToGameObject(GameObject go, string eventName, bool isRecursive false){if (go ! null){SendEventToGameObject(go, FsmEvent.FindEvent(eventName), isRecursive);}}public static void SendEventToGameObject(GameObject go, FsmEvent ev, bool isRecursive false){if (go ! null){ListPlayMakerFSM list ObtainFsmList();go.GetComponentsPlayMakerFSM(list);for (int i 0; i list.Count; i){list[i].Fsm.Event(ev);}ReleaseFsmList(list);if (isRecursive){Transform transform go.transform;for (int j 0; j transform.childCount; j){SendEventToGameObject(transform.GetChild(j).gameObject, ev, isRecursive);}}}}public static int GetInt(PlayMakerFSM fsm, string variableName){return fsm.FsmVariables.FindFsmInt(variableName).Value;}public static Vector3 GetVector3(PlayMakerFSM fsm, string variableName){return fsm.FsmVariables.FindFsmVector3(variableName).Value;}public static void SetBool(PlayMakerFSM fsm, string variableName, bool value){fsm.FsmVariables.GetFsmBool(variableName).Value value;}public static void SetInt(PlayMakerFSM fsm, string variableName, int value){fsm.FsmVariables.GetFsmInt(variableName).Value value;}public static void SetFloat(PlayMakerFSM fsm, string variableName, float value){fsm.FsmVariables.GetFsmFloat(variableName).Value value;}public static void SetString(PlayMakerFSM fsm, string variableName, string value){fsm.FsmVariables.GetFsmString(variableName).Value value;}public abstract class CheckFsmStateAction : FsmStateAction{public FsmEvent trueEvent;public FsmEvent falseEvent;public abstract bool IsTrue { get; }public override void Reset(){trueEvent null;falseEvent null;}public override void OnEnter(){if (IsTrue){Fsm.Event(trueEvent);}else{Fsm.Event(falseEvent);}Finish();}} }OK完全解读以后就回到Unity编辑器中托好变量 4.在敌人的HealthManager.cs脚本中添加上吉欧的逻辑处理 终于来到最后一步了既然做了吉欧的其它逻辑处理了那当然还差一步就是让敌人掉落钱了我们都知道每一个敌人身上都有healthmanager.cs这个脚本的 我们在敌人死亡也就是Die()函数中完成 using System; using System.Collections; using HutongGames.PlayMaker; using UnityEngine; using UnityEngine.Audio;public class HealthManager : MonoBehaviour, IHitResponder {[Header(Geo)][SerializeField] private int smallGeoDrops; //掉落多少小型geo[SerializeField] private int mediumGeoDrops;//掉落多少中型geo[SerializeField] private int largeGeoDrops;//掉落多少大型geo[SerializeField] private bool megaFlingGeo; //让geo掉落飞的范围更大[SerializeField] private GameObject smallGeoPrefab;[SerializeField] private GameObject mediumGeoPrefab;[SerializeField] private GameObject largeGeoPrefab;public void Die(float? attackDirection, AttackTypes attackType, bool ignoreEvasion){if (isDead){ return;}if (sprite){sprite.color Color.white;}FSMUtility.SendEventToGameObject(gameObject, ZERO HP, false);if (hasSpecialDeath){NonFatalHit(ignoreEvasion);return;}isDead true;if(damageHero ! null){damageHero.damageDealt 0;}if(battleScene ! null !notifiedBattleScene){PlayMakerFSM playMakerFSM FSMUtility.LocateFSM(battleScene, Battle Control);if(playMakerFSM ! null){FsmInt fsmInt playMakerFSM.FsmVariables.GetFsmInt(Battle Enemies);if(fsmInt ! null){fsmInt.Value--;notifiedBattleScene true;}}}if (deathAudioSnapshot ! null){deathAudioSnapshot.TransitionTo(6f);}if (sendKilledTo ! null){FSMUtility.SendEventToGameObject(sendKilledTo, KILLED, false);}if(attackType AttackTypes.Splatter){GameCameras.instance.cameraShakeFSM.SendEvent(AverageShake);Debug.LogWarningFormat(this, Instantiate!, Array.Emptyobject());InstantiateGameObject(corpseSplatPrefab, transform.position effectOrigin, Quaternion.identity);if (enemyDeathEffects){enemyDeathEffects.EmitSound();}Destroy(gameObject);return;}if(attackType ! AttackTypes.RuinsWater){//随机化生成的geo生成的角度和速度范围float angleMin megaFlingGeo ? 65 : 80;float angleMax megaFlingGeo ? 115 : 100;float speedMin megaFlingGeo ? 30 : 15;float speedMax megaFlingGeo ? 45 : 30;//各种面值geo生成的数量int num smallGeoDrops;int num2 mediumGeoDrops;int num3 largeGeoDrops;bool flag false;if(GameManager.instance.playerData.equippedCharm_24 !GameManager.instance.playerData.brokenCharm_24) //如果拥有护符易碎贪婪{num Mathf.CeilToInt(num * 0.2f);num2 Mathf.CeilToInt(num2 * 0.2f);num3 Mathf.CeilToInt(num3 * 0.2f);flag true;}//生成并让geo全部飞起来GameObject[] gameObjects FlingUtils.SpawnAndFling(new FlingUtils.Config{Prefab smallGeoPrefab,AmountMin num,AmountMax num,SpeedMin speedMin,SpeedMax speedMax,AngleMin angleMin,AngleMax angleMax}, transform, effectOrigin);if (flag){SetGeoFlashing(gameObjects, smallGeoDrops);}gameObjects FlingUtils.SpawnAndFling(new FlingUtils.Config{Prefab mediumGeoPrefab,AmountMin num2,AmountMax num2,SpeedMin speedMin,SpeedMax speedMax,AngleMin angleMin,AngleMax angleMax}, transform, effectOrigin);if (flag){SetGeoFlashing(gameObjects, mediumGeoDrops);}gameObjects FlingUtils.SpawnAndFling(new FlingUtils.Config{Prefab largeGeoPrefab,AmountMin num3,AmountMax num3,SpeedMin speedMin,SpeedMax speedMax,AngleMin angleMin,AngleMax angleMax}, transform, effectOrigin);if (flag){SetGeoFlashing(gameObjects, largeGeoDrops);}}if (enemyDeathEffects ! null){if (attackType AttackTypes.Generic){enemyDeathEffects.doKillFreeze false;}enemyDeathEffects.RecieveDeathEvent(attackDirection, deathReset, attackType AttackTypes.Spell, false);}SendDeathEvent();Destroy(gameObject); //TODO:}/// summary/// 让geo闪烁起来/// /summary/// param namegameObjects/param/// param nameoriginalAmount/paramprivate void SetGeoFlashing(GameObject[] gameObjects, int originalAmount){for (int i gameObjects.Length - 1; i originalAmount; i--){GeoControl component gameObjects[i].GetComponentGeoControl();if (component){component.SetFlashing();}}} } 我们需要一个静态脚本FlingUtils.cs来控制如何让物体可靠的飞起来例如设置它的初始的位置和角度还有最主要的设置不同速度最好的方法是用正弦余弦函数设置多物体不同的速度 using UnityEngine;public static class FlingUtils {public static GameObject[] SpawnAndFling(Config config,Transform spawnPoint,Vector3 positionOffset){if(config.Prefab null){return null;}int num Random.Range(config.AmountMin, config.AmountMax 1);Vector3 a (spawnPoint ! null) ? spawnPoint.TransformPoint(positionOffset) : positionOffset;GameObject[] array new GameObject[num];for (int i 0; i num; i){Vector3 position a new Vector3(Random.Range(-config.OriginVariationX, config.OriginVariationX), Random.Range(-config.OriginVariationY, config.OriginVariationY));GameObject gameObject config.Prefab.Spawn(position);gameObject.transform.position position;Rigidbody2D component gameObject.GetComponentRigidbody2D();if(component ! null){float d Random.Range(config.SpeedMin, config.SpeedMax);float num2 Random.Range(config.AngleMin, config.AngleMax);component.velocity new Vector2(Mathf.Cos(num2 * 0.017453292f) * d, Mathf.Sin(num2 * 0.017453292f) * d);}array[i] gameObject;}return array;}public static void FlingChildren(ChildrenConfig config, Transform spawnPoint, Vector3 positionOffset){if (config.Parent null){return;}Vector3 a (spawnPoint ! null) ? spawnPoint.TransformPoint(positionOffset) : positionOffset;int num (config.AmountMax 0) ? Random.Range(config.AmountMin, config.AmountMax) : config.Parent.transform.childCount;for (int i 0; i num; i){Transform child config.Parent.transform.GetChild(i);child.gameObject.SetActive(true);child.transform.position a new Vector3(Random.Range(-config.OriginVariationX, config.OriginVariationX), Random.Range(-config.OriginVariationY, config.OriginVariationY), 0f);Rigidbody2D component child.GetComponentRigidbody2D();if (component ! null){float d Random.Range(config.SpeedMin, config.SpeedMax);float num2 Random.Range(config.AngleMin, config.AngleMax);component.velocity new Vector2(Mathf.Cos(num2 * 0.017453292f), Mathf.Sin(num2 * 0.017453292f)) * d;}}}public struct Config{public GameObject Prefab;public float SpeedMin;public float SpeedMax;public float AngleMin;public float AngleMax;public float OriginVariationX;public float OriginVariationY;public int AmountMin;public int AmountMax;}public struct ChildrenConfig{public GameObject Parent;public int AmountMin;public int AmountMax;public float SpeedMin;public float SpeedMax;public float AngleMin;public float AngleMax;public float OriginVariationX;public float OriginVariationY;}public struct SelfConfig{public GameObject Object;public float SpeedMin;public float SpeedMax;public float AngleMin;public float AngleMax;}}二、制作HUD Canvas的初始的额外内容 这部分时比较水的就是只是添加上额外内容的MeshRenderer没有技术含量的做完记得关闭它们的meshrenderer 首先是Blocker HUD Icon说实话我都没用过这个护符不懂是干嘛的 然后是大部分耳熟能详的梦之钉 这里也就做一个展示而已没有实际效果 然后是寻神者模式下的禁用图标还有寻神者模式         内容太水了哈哈没事大家就看个乐吧。 总结 然后记得为每一个敌人的healthmanager.cs添加好三个面值的geo的预制体以及这个敌人要生成多少数量的不同面值的geo吉欧来到测试场景这里我就举个例子比如这个后面要讲的敌人螳螂我给它设置的参数是这样的 7个一元面值的小geo2个5元面值的中geo。运行游戏后geo sprite播放动画 回到Idle状态下 击杀以后掉落金币 生成的数量也没问题 动画也没有问题增加的数量也没问题  还记得我前面讲过的逻辑处理的AddGeo的三种状态吗当玩家在持续捡钱的时候状态不会发生变化直到玩家在一段时间没捡钱后就切换状态到状态2 这里为什么是517是因为我按了一下作弊键给自己加了500块钱实际上应该加的17根本没有多和少因此也算顺利展示了金钱系统Geo大多数的逻辑处理那为什么是大多数呢因为花费吉欧的逻辑处理我还没展示给你们看这个要等多后续的内容才能见分晓了。
http://www.w-s-a.com/news/464970/

相关文章:

  • 建设外贸商城网站制作如何建设景区旅游网站
  • 网站建设服务的具体条件怎么建设一个响应式网站
  • 做flash的网站wordpress设置前台投稿
  • 商务网站开发文档迅雷资源做下载网站
  • 无极磁铁网站如何把地图放到自己做的网站上
  • 青浦赵巷网站建设公司网站开发需求文档
  • 苏州网站建设的公司哪家好无锡网站制作那些
  • 装饰公司网站模板科技成果鉴定机构
  • 给公司做的东西放到私人网站上十堰为企业做网站的单位
  • 手机网站建设价钱手机自己做网站
  • 网站建设属于哪种公司电子商务查询网站
  • 工程建设标准强制性条文最新版本网站关键词排名优化应该怎么做
  • 网站网页设计内容品牌高端网站建设公司
  • 网站开发报价 福州中国建筑网官网手机版
  • 网站 图片 自动往右移专门做定制化的网站
  • 最好用的cms手机百度关键词排名 网站优化软件
  • 凉山州城乡规划建设局网站长沙网站建设哪家强
  • 广州网站开发创意设计公司企业自己怎么制作网站首页
  • 曲靖 曲靖网站建设软件(app)开发wordpress 没有远程发布
  • 官方网站开发与定制网站建设技术是干嘛的
  • 昆明网站建设工作室网站菜单导航怎么做的
  • 南京网站做的好的公司猪八戒网站做推广怎么样
  • 建站收费标准福州网站搭建
  • 做防护用品的网站欧美网站建设风格特点
  • 龙华做网站联系电话北京软件开发培训班
  • 做网站运营有前途网站的建设与管理的心得体会
  • 河南网站推广怎么做网页制作免费下载
  • 网站如何屏蔽中国ip商丘网站建设的公司哪家好
  • 东莞广告公司东莞网站建设价格鹤壁哪有做网站的
  • 门户网站界面设计logo设计商标设计