unity中为啥我控制一个character controller物体,走向有capsule collider的物体,无法触发碰撞事件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity中为啥我控制一个character controller物体,走向有capsule collider的物体,无法触发碰撞事件相关的知识,希望对你有一定的参考价值。

OnCollisionEnter

OnCollisionExit

OnCollisionStay
就是这三个中的任意一个都不行

参考技术A Collision 函数触发条件:两个物体有Collider,其中一个有Rigidbody
Trigger 函数触发条件: 同上,至少一个勾选了isTrigger
charater controller 确实不需要Rigidbody就能检测碰撞,但是并非对应上述两个函数,
对应的函数为 OnControllerColliderHit( ControllerColliderHit hit ),在调用CharacterController.Move函数的时候触发本回答被提问者和网友采纳

Unity实现动作游戏的技能系统(Ability System)设计原型

前言

尝试写一个技能系统,希望其尽量完善。目前能想到的元素包括控制、模型、动画、音效、特效、碰撞检测、事件响应、伤害判断、Buff控制。集所有元素为一个编辑器,方便策划和美术进行操作。

输入控制

使用Input System作为跨平台接收输入响应,然后整合到Character脚本中,然后由CharacterOnCharacterEvent事件节点,监听对应的操作。

public void AddActionStarted(string actionName,Action<InputAction.CallbackContext> callback)

   GetInputAction(actionName).started += callback;

public void AddActionPerformed(string actionName, Action<InputAction.CallbackContext> callback)

   GetInputAction(actionName).performed += callback;

public void AddActionCanceled(string actionName, Action<InputAction.CallbackContext> callback)

   GetInputAction(actionName).canceled += callback;



private InputAction GetInputAction(string actionName)

   var action = _inputCharacterGamePlay.FindAction(actionName, throwIfNotFound: true);
   return action;

技能编辑

使用Timeline作为一个整合工具,可以添加动画特效音效物体控制扩展脚本集成为一个技能,并可以在Scene中随时进行预览。具体操作可以参考官方教程。

扩展了一个PlayableAsset作为Combo触发条件,为连击动画的衔接尽量合理而规定了一定的触发范围。

角色编辑器

在编辑了多个技能后,肯定需要一个角色编辑器来统筹所有的技能。规范技能播放的规则,进行碰撞检测等一系列操作,打通角色的操作的逻辑。
这里的Character是通过继承ScriptableObject实现的,方便保存角色的系列信息,并扩展了一个CharacterEditor,用来编辑保存角色的一些属性、技能、以及控制逻辑。

技能触发

在角色编辑器中创建OnCharacterEvent节点,然后创建一个Skill节点,连接即可触发技能播放。事件支持Input System触发,直接输入Input Action的名称,就可以获取当前的输入返回的参数。

若当前技能需要技能效果,则利用Timeline创建多个技能,通过OnCombo进行连击即可触发,下面多连击动作的展示。

  1. 连击A
  2. 连击AA
  3. 连击AAA

基础动画

除了技能动画以外, 还有一些IdleWalkJump等常规动画。本来想沿用技能实现使用Timeline一套的解决方案,但是总感觉有点不搭。这里还是使用了默认的Animator让几个基础动画的切换感觉更合理一些。

输入在Input System中添加movementInput Action使用Vector2作为返回值, 键盘WASD、xbox的摇杆、以及移动端的虚拟摇杆都可以映射为一个Vector2的值,方便进行角色的控制。

基础动画的展示

碰撞检测

这里我主要在角色的大刀上绑定了一个碰撞盒子,并结合Timeline在技能施放动画的一定区间范围内开启碰撞盒子,方便让攻击的碰撞更为合理。并且在编辑器里面添加了一个创建测试的敌人的快捷按钮Create Enemy

在检测的碰撞的同时,可以获取当前角色正在施放的技能信息。即可对敌人进行,伤害判定,播放受击动画,以及添加BUFF或者DEBUFF。
因为连击技能也是一个个单独的技能,每个连击动作都有自己的单独属性,都可以根据不同的连击动画,给敌人造成更高的伤害。

敌人受击展示

BUFF系统

Buff主要是一个以计时器驱动的角色属性持续修改的状态。它本身包括的东西很多,除了就能修改角色自带的那一部分属性,还可以对角色进行一些其他操作,比如无敌击飞击退沉默恐惧嘲讽禁锢等等。

因为Buff的重复使用率非常高,这里会建立一个Buff池,在角色收到一个技能攻击的时候,会从Buff Pool中取出一个Buff并对其进行初始化,然后遍历当前角色的所有Buff,并根据Buff的基本信息,确定其中的优先级,然后执行对应的逻辑。在计时结束的时候,会回收给Buff池。
Buff持续存在的时间段中,角色的实时属性,有基础属性+Buff的各种因子综合而来。

未完待续

根据具体的需求,一个技能系统的复杂程度远不止于此。当前很多东西,还没设计完善,都还是针对点的说明,后续持续修改更新。
这篇博客在这里也算抛砖引玉了。

以上是关于unity中为啥我控制一个character controller物体,走向有capsule collider的物体,无法触发碰撞事件的主要内容,如果未能解决你的问题,请参考以下文章

Unity实现动作游戏的技能系统(Ability System)设计原型

Unity实现动作游戏的技能系统(Ability System)设计原型

Unity实现动作游戏的技能系统(Ability System)设计原型

详解Unity中的角色控制器

为啥unity3d进去之后没有鼠标?

Unity Ragdoll Character Creator,Rigidbody [] Arrays和一般代码问题