Unity c# 状态机的简单入门

简介: Unity c# 状态机的简单入门状态机模式在unity中作用是非常大的,可以实现角色的移动和场景的跳转,包括一些动画的播放,在很多unity框架中也是很常见的,发散思维广阔,下面是简单的状态机的实现,有注释using System.

Unity c# 状态机的简单入门
状态机模式在unity中作用是非常大的,可以实现角色的移动和场景的跳转,包括一些动画的播放,在很多unity框架中也是很常见的,发散思维广阔,下面是简单的状态机的实现,有注释

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum StateType
{

Idle,
Die,
Move,

}

public abstract class StateObject
{

protected StateManger state;
public StateObject(StateManger _sm)
{
    state = _sm;
}
//进入方法
public abstract void EnterState();
 //离开方法
public abstract void ExiState();
//持续更新方法
public abstract void UpdateState();

}
//站着状态
public class IdleState : StateObject
{

public IdleState(StateManger state):base(state)
{

}

public override void EnterState()
{
    Debug.Log("进入站着状态");
}

public override void ExiState()
{
    Debug.Log("离开站着状态");
}

public override void UpdateState()
{
    Debug.Log("等待站着状态");
    if (Input .GetKey(KeyCode.M))
    {
        Debug.Log("按下咯");
        state.ChangeState("Move");
    }
    if (Input.GetKey(KeyCode.D))
    {
        state.ChangeState("Die");
    }
}

}
//移动状态
public class MoveState : StateObject
{

public MoveState(StateManger state):base(state)
{

}
public override void EnterState()
{
    Debug.Log("进入移动状态");
}

public override void ExiState()
{
    Debug.Log("离开移动状态");
}

public override void UpdateState()
{
    Debug.Log("进入移动更新状态");
    if (Input.GetKey(KeyCode.D))
    {
        state.ChangeState("Die");
    }
    if (Input.GetKey(KeyCode.I))
    {
        state.ChangeState("Idle");
    }
}

}
//死亡状态
public class DieState : StateObject
{

public DieState(StateManger state) : base(state)
{

}
public override void EnterState()
{
    Debug.Log("进入死亡状态");
}

public override void ExiState()
{
    Debug.Log("离开死亡状态");
}

public override void UpdateState()
{
    Debug.Log("进入死亡更新状态");
   
    if (Input.GetKey(KeyCode.I))
    {
        state.ChangeState("Idle");
    }
}

}
public class StateManger {

//字典存储状态
Dictionary<string, StateObject> dic = new Dictionary<string, StateObject>();
//当前状态
StateObject currentstate;
//注册状态
public void Region(string statename,StateObject state)
{
    //判断字典中是否存在这个键
    if (!dic.ContainsKey(statename))
    {
        dic.Add(statename,state);
    }
}
//设置默认状态
public  void SetDefat(string statename)
{
    //判断字典中是否存在这个状态
    if (dic.ContainsKey(statename))
    {
        //存在就赋值给currentstate
        currentstate = dic[statename];
        //调用当前状态的进入(EnterState)方法
        currentstate.EnterState();
    }
}
//改变状态
public  void ChangeState(string statename)
{
    //判断字典中是否存在这个状态
    if (dic.ContainsKey(statename))
    {
        //当前状态是否为空
        if (currentstate!=null)
        {
            //调用上一个状态的离开方法
            currentstate.ExiState();
           //把取到的状态赋值给currentstate
            currentstate = dic[statename];
            //调用取到状态的进入方法
            currentstate.EnterState();
        }
    }
}
//更新状态
public void UpdateState()
{
    Debug.Log("更新状态");
    if (currentstate!=null)
    {
        //当前状态的UpdateState方法
        currentstate.UpdateState();
    }
}

}
public class FMSC : MonoBehaviour {

StateManger sm = new StateManger();
// Use this for initialization
void Start () {
    //注册站着的方法
    sm.Region("Idle",new IdleState(sm));
    //注册死亡的方法
    sm.Region("Die",new DieState(sm));
    //注册移动的方法
    sm.Region("Move",new MoveState(sm));
    //设置默认状态
    sm.SetDefat("Idle");
}

// Update is called once per frame
void Update () {
    //持续调用当前状态的UpdateState方法
    sm.UpdateState();
}

}

每个状态都是有自己的方法,在每个状态有不同要做的事情,减少代码的耦合性

作者:憨豆人生
来源:CSDN
原文:https://blog.csdn.net/qq_40390815/article/details/90633826
版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章
|
11天前
|
缓存 图形学
Unity C#for和foreach效率比较
该代码对比了三种遍历 `List&lt;int&gt;` 的方式的性能:使用缓存 `Count` 的 `for` 循环、每次访问 `list.Count` 的 `for` 循环以及 `foreach` 循环。通过 `Stopwatch` 测量每次遍历 300 万个元素所花费的时间,并输出结果。测试可在 Unity 环境中运行,按下空格键触发。结果显示,缓存 `Count` 的 `for` 循环性能最优,`foreach` 次之,而每次都访问 `list.Count` 的 `for` 循环最慢。
|
3月前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
117 4
|
3月前
|
程序员 C# 图形学
全面的C#/.NET自学入门指南
全面的C#/.NET自学入门指南
|
4月前
|
开发框架 .NET API
RESTful API 设计与实现:C# 开发者的一分钟入门
【10月更文挑战第5天】本文从零开始,介绍了如何使用 C# 和 ASP.NET Core 设计并实现一个简单的 RESTful API。首先解释了 RESTful API 的概念及其核心原则,然后详细说明了设计 RESTful API 的关键步骤,包括资源识别、URI 设计、HTTP 方法选择、状态码使用和错误处理。最后,通过一个用户管理 API 的示例,演示了如何创建项目、定义模型、实现控制器及运行测试,帮助读者掌握 RESTful API 的开发技巧。
134 7
|
4月前
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
108 8
|
4月前
|
C#
C#入门
C#入门
33 0
|
5月前
|
安全 数据库连接 API
C#一分钟浅谈:多线程编程入门
在现代软件开发中,多线程编程对于提升程序响应性和执行效率至关重要。本文从基础概念入手,详细探讨了C#中的多线程技术,包括线程创建、管理及常见问题的解决策略,如线程安全、死锁和资源泄露等,并通过具体示例帮助读者理解和应用这些技巧,适合初学者快速掌握C#多线程编程。
103 0
|
5月前
|
设计模式 C# 开发者
C#设计模式入门实战教程
C#设计模式入门实战教程
|
5月前
|
开发框架 .NET Java
C#/.NET/.NET Core自学入门指南
C#/.NET/.NET Core自学入门指南
117 0
|
6月前
|
开发者 图形学 C#
深度解密:Unity游戏开发中的动画艺术——Mecanim状态机如何让游戏角色栩栩如生:从基础设置到高级状态切换的全面指南,助你打造流畅自然的游戏动画体验
【8月更文挑战第31天】Unity动画系统是游戏开发的关键部分,尤其适用于复杂角色动画。本文通过具体案例讲解Mecanim动画状态机的使用方法及原理。我们创建一个游戏角色并设计行走、奔跑和攻击动画,详细介绍动画状态机设置及脚本控制。首先导入动画资源并添加Animator组件,然后创建Animator Controller并设置状态间的转换条件。通过编写C#脚本(如PlayerMovement)控制动画状态切换,实现基于玩家输入的动画过渡。此方法不仅适用于游戏角色,还可用于任何需动态动画响应的对象,增强游戏的真实感与互动性。
171 0