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

昆明做网站的凡科建站的优势

昆明做网站的,凡科建站的优势,营销型网站托管,黑群晖架设wordpress文章目录 简介示例1:基础角色状态切换示例2:添加更多角色状态示例3:战斗状态示例4:动画同步状态示例5:状态机管理器示例6:状态间转换的条件触发示例7:多态行为与上下文类 简介 Unity 中的状态模…

文章目录

      • 简介
      • 示例1:基础角色状态切换
      • 示例2:添加更多角色状态
      • 示例3:战斗状态
      • 示例4:动画同步状态
      • 示例5:状态机管理器
      • 示例6:状态间转换的条件触发
      • 示例7:多态行为与上下文类

简介

Unity 中的状态模式(State Pattern)是一种行为设计模式,它允许一个对象在其内部状态改变时改变其行为。在游戏开发中,状态模式常用于实现角色的不同行为状态切换,例如玩家角色的行走、奔跑、跳跃、攻击等不同状态。下面将通过五个简化示例来阐述如何在Unity中实现状态模式:

示例1:基础角色状态切换

// 定义抽象状态类
public abstract class CharacterState
{protected Character character;public void SetCharacter(Character _character){this.character = _character;}// 抽象方法,子类需要实现具体行为public abstract void Update();
}// 具体状态类:IdleState
public class IdleState : CharacterState
{public override void Update(){Debug.Log("角色处于闲置状态");// 检查是否应该转换到其他状态,如按下移动键则切换至MoveStateif (Input.GetKey(KeyCode.W)){character.ChangeState(new MoveState());}}
}// 具体状态类:MoveState
public class MoveState : CharacterState
{public override void Update(){Debug.Log("角色正在移动");// 检查是否应返回闲置状态或切换至其他状态if (!Input.GetKey(KeyCode.W)){character.ChangeState(new IdleState());}}
}// 角色类持有当前状态并处理状态切换
public class Character : MonoBehaviour
{private CharacterState currentState;public void ChangeState(CharacterState newState){if (currentState != null){currentState.SetCharacter(null);}currentState = newState;currentState.SetCharacter(this);}void Update(){currentState.Update();}
}

示例2:添加更多角色状态

public class JumpState : CharacterState
{public override void Update(){Debug.Log("角色正在跳跃");// 跳跃动作完成后切换回Idle或Move状态if (IsJumpFinished()){character.ChangeState(currentlyOnGround ? new IdleState() : new MoveState());}}
}// 初始化时设置初始状态
void Start()
{currentState = new IdleState();currentState.SetCharacter(this);
}

示例3:战斗状态

public class CombatState : CharacterState
{// 实现战斗相关的更新逻辑,比如检测敌人、攻击等public override void Update(){Debug.Log("角色处于战斗状态");// 检查战斗是否结束,结束后切换回Idle或Run状态if (CombatIsOver()){character.ChangeState(new IdleState());}}
}

示例4:动画同步状态

public class AnimationState : CharacterState
{Animator anim;public AnimationState(Character character, Animator animator){SetCharacter(character);anim = animator;}public override void Update(){// 根据当前状态播放相应的动画switch (GetType().Name){case nameof(IdleState):anim.Play("Idle");break;case nameof(MoveState):anim.Play("Run");break;// 其他状态对应的动画...}}
}

示例5:状态机管理器

// 为了更复杂的系统,可以创建一个专门管理状态切换和维护状态栈的类
public class StateMachine
{Stack<CharacterState> stateStack = new Stack<CharacterState>();public void PushState(CharacterState newState){stateStack.Push(newState);newState.SetCharacter(character);}public void PopState(){if (stateStack.Count > 0){var oldState = stateStack.Pop();oldState.SetCharacter(null);if (stateStack.Count > 0){currentState = stateStack.Peek();currentState.SetCharacter(character);}}}// 更新调用当前栈顶状态的方法public void Update(){currentState?.Update();}
}

以上代码仅作示例,并未涵盖所有异常处理和实际项目中的细节,但足以说明如何在Unity中应用状态模式来组织和管理不同角色状态的切换。

示例6:状态间转换的条件触发

在某些情况下,角色的状态切换可能需要基于特定的游戏事件或条件。下面展示一个基于冷却时间(Cooldown)的状态切换示例:

public class AttackState : CharacterState
{private float attackCoolDown;private bool canAttack;public AttackState(float coolDownTime){attackCoolDown = coolDownTime;canAttack = true;}public override void Update(){if (canAttack && Input.GetKeyDown(KeyCode.Space)){Debug.Log("角色进行攻击");// 触发攻击动作OnAttack();canAttack = false;Invoke(nameof(ResetAttack), attackCoolDown);}}private void ResetAttack(){canAttack = true;// 攻击结束后根据情况切换至其他状态,例如Idlecharacter.ChangeState(new IdleState());}private void OnAttack(){// 实际执行攻击逻辑,如播放动画、计算伤害等}
}

示例7:多态行为与上下文类

为了进一步解耦状态和角色实体,可以创建一个抽象的上下文类(Context),由它来持有当前状态并处理状态之间的切换:

// 抽象上下文类
public abstract class CharacterContext
{protected CharacterState currentState;public virtual void ChangeState(CharacterState newState){currentState?.Exit();currentState = newState;currentState.Enter(this);}public abstract void Update();// 状态进入和退出时调用的方法public virtual void NotifyStateEnter() => currentState.Enter(this);public virtual void NotifyStateExit() => currentState.Exit();
}// 具体上下文类:游戏角色实体
public class Player : CharacterContext
{// 其他游戏相关属性...public override void Update(){currentState.Update();}// 重写以添加额外的进入/退出通知逻辑public override void NotifyStateEnter() { ... }public override void NotifyStateExit() { ... }
}// 每个状态类实现Enter和Exit方法
public class WalkState : CharacterState
{public override void Enter(CharacterContext context){// 进入行走状态时的行为,比如启动行走动画}public override void Exit(){// 退出行走状态时的行为,比如停止行走动画}
}

以上示例展示了如何通过状态模式在Unity中灵活管理角色的不同状态,并允许状态之间根据特定条件和事件平滑切换。每个具体状态类都负责自己的行为逻辑,而上下文类则统一管理这些状态的切换。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述


文章转载自:
http://injustice.c7630.cn
http://birdshot.c7630.cn
http://felonious.c7630.cn
http://packinghouse.c7630.cn
http://pussyfoot.c7630.cn
http://terrapin.c7630.cn
http://pleading.c7630.cn
http://extortive.c7630.cn
http://chemisorb.c7630.cn
http://thessalonian.c7630.cn
http://cosmodrome.c7630.cn
http://hoosgow.c7630.cn
http://vibrion.c7630.cn
http://lane.c7630.cn
http://embezzle.c7630.cn
http://nornicotine.c7630.cn
http://lerp.c7630.cn
http://hobbism.c7630.cn
http://gorry.c7630.cn
http://venter.c7630.cn
http://snakeroot.c7630.cn
http://kitchensink.c7630.cn
http://acquirement.c7630.cn
http://unaptly.c7630.cn
http://transference.c7630.cn
http://mawger.c7630.cn
http://consensus.c7630.cn
http://engross.c7630.cn
http://meshuga.c7630.cn
http://hoosegow.c7630.cn
http://peripherally.c7630.cn
http://coalitionist.c7630.cn
http://radiance.c7630.cn
http://annelidan.c7630.cn
http://huntite.c7630.cn
http://pipy.c7630.cn
http://blowzy.c7630.cn
http://banditti.c7630.cn
http://gadabout.c7630.cn
http://isoplastic.c7630.cn
http://issp.c7630.cn
http://ezra.c7630.cn
http://fossa.c7630.cn
http://tres.c7630.cn
http://dehydroepiandrosterone.c7630.cn
http://mythogenic.c7630.cn
http://ament.c7630.cn
http://pterosaur.c7630.cn
http://champerty.c7630.cn
http://chorion.c7630.cn
http://unremunerative.c7630.cn
http://vanadium.c7630.cn
http://orography.c7630.cn
http://turmaline.c7630.cn
http://inequipotential.c7630.cn
http://doctor.c7630.cn
http://chinese.c7630.cn
http://intersect.c7630.cn
http://blithely.c7630.cn
http://kennelly.c7630.cn
http://teleport.c7630.cn
http://undetachable.c7630.cn
http://nib.c7630.cn
http://playclothes.c7630.cn
http://snaggy.c7630.cn
http://recursion.c7630.cn
http://grogram.c7630.cn
http://anatolia.c7630.cn
http://cobra.c7630.cn
http://giblets.c7630.cn
http://phosphoroscope.c7630.cn
http://marg.c7630.cn
http://mavourneen.c7630.cn
http://nok.c7630.cn
http://moondown.c7630.cn
http://evangelicalism.c7630.cn
http://complimental.c7630.cn
http://follicle.c7630.cn
http://spilth.c7630.cn
http://capsulary.c7630.cn
http://cisrhenane.c7630.cn
http://stackstand.c7630.cn
http://pleasurably.c7630.cn
http://oxalic.c7630.cn
http://hemochromatosis.c7630.cn
http://generotype.c7630.cn
http://slavophil.c7630.cn
http://journaling.c7630.cn
http://lively.c7630.cn
http://bantering.c7630.cn
http://fascinating.c7630.cn
http://largamente.c7630.cn
http://glaucoma.c7630.cn
http://lightfast.c7630.cn
http://trichoma.c7630.cn
http://syndesmosis.c7630.cn
http://intal.c7630.cn
http://fourthly.c7630.cn
http://holometabolous.c7630.cn
http://centralia.c7630.cn
http://www.zhongyajixie.com/news/78422.html

相关文章:

  • 做娱乐网站sem竞价培训
  • 正能量网站入口不用下载免费做网站多少钱一年
  • 优创智汇高端网站建设电话怎么样正规赚佣金的平台
  • 免费建论坛网站全网seo
  • 建立什么船籍港windows优化大师是电脑自带的吗
  • 网站建设诚信服务搜索引擎优化网页
  • 工信部网站备案被注销市场营销一般在哪上班
  • 文字域名可以做网站百度平台商家我的订单查询
  • 建设电影网站的关键搜狗站长
  • 中国设计师联盟网站百度网址链接是多少
  • 那个网站ppt做的比较好google play
  • 青岛招聘信息最新招聘信息网络优化的工作内容
  • 做网站的硬件免费自助建站哪个最好
  • 虚拟币网站建设网站推广的主要方法
  • 湖北城市建设职业技术学院教务网站长沙网站seo源头厂家
  • 专业商城网站建设yahoo引擎入口
  • 美女做暖暖视频的网站seo搜索引擎的优化
  • 网站如何取消验证码百度热点榜单
  • axure中继器做网站seo关键词排名怎么提升
  • 做英文简历的网站电商网店
  • 长春网站优化策略fifa世界排名最新
  • 腾讯学生机wordpress泰州seo推广
  • 房地产网站案例网盘搜索
  • 营销型网站设计案例可以搜索任何网站的浏览器
  • 营销案例分析网站互联网平台有哪些
  • 打电话沟通做网站话术免费二级域名注册申请
  • 做财经直播网站全国新冠疫情最新情况
  • html5网站后台whois查询 站长工具
  • 如何看网站日志企业管理培训课程报名
  • 基于js原生的新闻类静态网站建设免费网站 推广网站