Unity Demo

自己实现的Unity Demo的记录

随机地图生成

  ​randommap

  原理说明:

  预先准备好不同类型的房间模型。

  ​image

  ​image

  现在要把第二个房间接在第一个房间上,只需要从第二个房间的Connectors随机挑选一个可用的Connector——connectTo,将它设为第二个房间的父物体。然后在第一个房间中也选一个Connector——connectFrom。

  将connectTo设为connectFrom的子物体,然后重置connectTo的本地坐标和位置,再围绕y轴旋转180度即可拼接两个房间。

  连接的核心代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void ConnectTiles()
{
Transform connectFrom = GetRandomConnector(tileFrom);
if (connectFrom == null) return;
Transform connectTo = GetRandomConnector(tileTo);
if (connectTo == null) return;
connectTo.SetParent(connectFrom);
tileTo.SetParent(connectTo);
connectTo.localPosition = Vector3.zero;
connectTo.localRotation = Quaternion.identity;
connectTo.Rotate(0, 180f, 0);
tileTo.SetParent(container);
connectTo.SetParent(tileTo.Find("Connectors"));
generatedTiles.Last().connector = connectFrom.GetComponent<Connector>();
}

  进一步可以通过调整参数控制地图的生成

  ​image

角色控制

  ​charactercontroller

  ‍

  normalattack

  ​

  使用Character Controller和根运动动画

  1. PlayerPosture枚举: 这是角色的姿态枚举,用于描述角色当前的状态,比如站立、蹲下、跳跃、攀爬等。每个枚举值表示一种姿态。
  2. LocomotionState枚举: 这是角色的运动状态枚举,用于描述角色的移动状态,包括站立、行走、奔跑、攻击、使用技能等。每个枚举值表示一种运动状态。
  3. AnimatorInit()方法: 这个方法用于初始化动画状态机里相关参数的哈希值,以便在后续使用这些哈希值来控制动画状态。
  4. CheckEquipWeapon()方法: 检查是否装备武器,根据输入切换角色是否持有武器,并相应地激活/隐藏武器的游戏对象。
  5. CheckGround()方法: 用于检查角色是否在地面上。使用了射线检测来判断角色是否站在地面上,以便在合适的时机设置isGrounded变量。
  6. SwitchPlayerStates()方法: 根据角色的不同姿态和运动状态,进行状态切换。比如根据角色的运动状态和输入,判断角色应该是行走、奔跑还是站立。
  7. CaculateInputDirection()方法: 计算玩家输入方向在角色的本地坐标系下的方向。
  8. Jump()方法: 处理跳跃和攀爬等操作。根据输入和环境条件,决定角色应该执行的动作。
  9. SetupAnimator()方法: 设置动画参数,根据不同的状态和姿态来控制动画的播放。这里包括角色的移动速度、转向速度等信息。
  10. OnAnimatorMove()方法: 这个方法是 Unity 中 Animator 自带的回调函数。它在动画更新时被调用,用于应用动画控制的角色移动。这里根据不同的姿态和状态,应用动画的位移和角色的垂直速度来更新角色的位置。

  针对跳跃攀爬,根据射线检测结果、玩家的输入方向和与墙体的角度等条件,决定玩家的下一步动作,如跳跃、低位攀爬、高位攀爬、翻越或爬墙。

角色技能

  ​skill

  ‍

  ​image

  ​image

  调用流程:

  ​image

  所有技能资源:预制体和图标都通过Resource动态加载

UI

  ​ui

整体框架

  通过单例类UIManager来管理不同的UI面板。

  通过解析json文件来获取不同面板的路径然后动态加载。

  使用堆栈来管理面板进出的顺序,使得只有一个面板属于激活状态。

  所有面板都继承面板基类并实现其中的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class PanelBase : MonoBehaviour
{
public virtual void OnEnter(System.Object o = null)
{
this.gameObject.SetActive(true);
}
public virtual void OnStay(System.Object o = null)
{

}
public virtual void OnResume()
{

}
public virtual void OnExit()
{
this.gameObject.SetActive(false);
}
}

背包管理

  所有背包类似的功能都通过继承Inventory类实现,Inventory类实现了对应物品槽的管理,管理Slot对象。

  真正的物品都放在槽里,挂在ItemUI脚本。

  ItemUI脚本实现了物品的显示和交互,包括点击,拖拽事件,计算物品对人物的属性加成。

  物品的定义通过继承物品基类Item类实现,Item类中定义了物品的类型,品质,属性。

接入ChatGPT

  事件的管理通过EventManager单例类实现,初始化解析json文件实现初始的事件,同时每一次调用都会在后台通过ChatGPT生成新事件并存储在事件数组中,实现事件越来越丰富。

  ​event

  ‍


Unity Demo
https://shanhainanhua.github.io/2023/08/22/Unity-Demo/
作者
wantong
发布于
2023年8月22日
许可协议