找回密码
 立即注册
搜索
查看: 1531|回复: 13

[多平台] (超能力论坛)想找个熟悉虚幻4和西佳佳的老师可以吗?

[复制链接]
     
发表于 2019-5-28 10:29 来自手机 | 显示全部楼层 |阅读模式
听说街霸5是虚幻4做的,那么像街霸这种搓招系统在虚幻4里是怎么靠蓝图实现的呢?比如按两下w加鼠标左键释放一个技能。新手自己摸索了半天都无法完美实现,想找个老师有偿指导一下。
回复

使用道具 举报

     
发表于 2019-5-28 11:25 | 显示全部楼层
虚幻商城有搓招系统的蓝图卖,可以买一个研究下
回复

使用道具 举报

     
发表于 2019-5-28 11:54 | 显示全部楼层
本帖最后由 w酱 于 2019-5-28 11:56 编辑

coyote time(输入缓冲)了解一下,
先写一个array还是stack随便什么,然后tick的时候把输入键的id塞进缓存里,然后判断帧计数
之前按了几个指令多少帧按下了要干什么后面响应事件就完事了
虽然我觉得这种跟种引擎没关系就是了.....
回复

使用道具 举报

     
 楼主| 发表于 2019-5-28 12:54 来自手机 | 显示全部楼层
natsu1211 发表于 2019-5-28 11:10
https://www.udemy.com/introduction-to-unreal-engine-4-ability-system/

感谢帮忙,可惜英文教程我看起来太吃力了
回复

使用道具 举报

     
 楼主| 发表于 2019-5-28 12:56 来自手机 | 显示全部楼层
慕容断月 发表于 2019-5-28 11:25
虚幻商城有搓招系统的蓝图卖,可以买一个研究下

大佬可以麻烦给个搜索的关键词吗?
回复

使用道具 举报

     
 楼主| 发表于 2019-5-28 13:01 来自手机 | 显示全部楼层
w酱 发表于 2019-5-28 11:54
coyote time(输入缓冲)了解一下,
先写一个array还是stack随便什么,然后tick的时候把输入键的id塞进缓存 ...

可以详细一点吗亲,新手刚学还望见谅
回复

使用道具 举报

发表于 2019-5-28 13:03 | 显示全部楼层
就是个状态转移图,招数不多的话直接用数组+字符串匹配就可以,每一帧判断按键是否满足状态转换条件,满足就进下一状态,不满足就回到初始状态(比如不匹配、帧计数间隔过长等)。如果进入了出招的状态就出招,出完招回到初始状态。
回复

使用道具 举报

     
 楼主| 发表于 2019-5-28 13:23 来自手机 | 显示全部楼层
Lunamos 发表于 2019-5-28 13:03
就是个状态转移图,招数不多的话直接用数组+字符串匹配就可以,每一帧判断按键是否满足状态转换条件,满足 ...

谢谢,我尝试一下
回复

使用道具 举报

     
发表于 2019-5-28 14:03 | 显示全部楼层
女仆高达 发表于 2019-5-28 13:01
可以详细一点吗亲,新手刚学还望见谅

我随便写点别的语言伪代码,对错也没研究,凑合看吧


  1.   

  2.     public class Test_BufferedInput
  3.     {

  4.         void onCreate()
  5.         {
  6.             clearBuffer();
  7.         }

  8.         

  9.         void clearBuffer()
  10.         {
  11.             ctTimer = 0;
  12.             for (int i = 0; i < 4; ++i) buffer[i] = EInputBtnType.None;
  13.         }

  14.         void Push_Skill(string t)
  15.         {
  16.                 //blabla...放点什么技能然后处理一下关掉状态什么的
  17.         }
  18.         
  19.         public bool bCharacterReady = true;
  20.         public bool bCharacterCanAttack = true;
  21.         private EInputBtnType[] buffer = new EInputBtnType[4];

  22.         private int ctTimer = 0;

  23.         void onTick()
  24.         {
  25.             if (bCharacterReady) checkActionsOnTIck();
  26.         }
  27.         //逐帧检查状态
  28.         void checkActionsOnTIck()
  29.         {
  30.             //如果能放技能
  31.             if (bCharacterCanAttack)
  32.             {
  33.                 //当前帧按下了W
  34.                 if (InputProcessor.IsPressed(EInputBtnType.BTN_W))
  35.                 {
  36.                     buffer[0] = buffer[1];
  37.                     buffer[1] = buffer[2];
  38.                     buffer[2] = buffer[3];
  39.                     buffer[3] = EInputBtnType.BTN_W;
  40.                 }
  41.                 //当前帧按下了鼠标左键
  42.                 else if (InputProcessor.IsPressed(EInputBtnType.BTN_LMB))
  43.                 {
  44.                     buffer[0] = buffer[1];
  45.                     buffer[1] = buffer[2];
  46.                     buffer[2] = buffer[3];
  47.                     buffer[3] = EInputBtnType.BTN_LMB;
  48.                 }
  49.                 //blabla...
  50.                 //如果10帧以内有按键输入并且符合 w + w + lmb
  51.                 if (ctTimer < 10)
  52.                 {
  53.                     if (buffer[3] == EInputBtnType.BTN_LMB && buffer[2] == EInputBtnType.BTN_W &&
  54.                         buffer[1] == EInputBtnType.BTN_W)
  55.                     {
  56.                         //放技能
  57.                         Push_Skill("skill_w+lmb");
  58.                         ctTimer = 10;
  59.                         for (int i = 0; i < 4; ++i) buffer[i] = EInputBtnType.None;
  60.                     }
  61.                     else
  62.                     {
  63.                         //按键不是这个组合
  64.                         //blabla...
  65.                     }
  66.                 }
  67.                 //按键超时,清空缓冲
  68.                 else if (buffer[3] != EInputBtnType.None)
  69.                 {
  70.                     ctTimer = 0;
  71.                     for (int i = 0; i < 4; ++i) buffer[i] = EInputBtnType.None;
  72.                 }
  73.                 ctTimer++;
  74.             }
  75.             //如果不能放技能,清空
  76.             else
  77.             {
  78.                 if (ctTimer > 0)
  79.                 {
  80.                     ctTimer = 0;
  81.                     for (int i = 0; i < 4; ++i) buffer[i] = EInputBtnType.None;
  82.                 }
  83.                 //blabla...
  84.             }
  85.         }
  86.     }
复制代码
回复

使用道具 举报

     
发表于 2019-5-28 14:20 | 显示全部楼层
本帖最后由 zag 于 2019-5-28 14:21 编辑

以前论坛里有人贴过分析街霸的指令系统的网页,

简单来说就是对于每一个角色的每一个技能你都需要有一个buffer(具体实现方法可以不同),

每个渲染循环你对输入进行处理的时候,根据技能的设置,也就是指令间无效指令的宽容程度等对buffer进行填充,最后释放先达到有效的技能

要实现街霸5的效果稍微有些复杂就是了
回复

使用道具 举报

     
发表于 2019-5-28 14:49 | 显示全部楼层
本帖最后由 慕容断月 于 2019-5-28 14:52 编辑
女仆高达 发表于 2019-5-28 12:56
大佬可以麻烦给个搜索的关键词吗?

https://www.unrealengine.com/marketplace/input-buffer

拿好

之前说的应该是这个输入预存的插件
回复

使用道具 举报

     
发表于 2019-5-28 18:50 | 显示全部楼层
和引擎毫无关系吧
回复

使用道具 举报

     
 楼主| 发表于 2019-5-29 09:46 来自手机 | 显示全部楼层
w酱 发表于 2019-5-28 14:03
我随便写点别的语言伪代码,对错也没研究,凑合看吧

太感谢了!试着用你的方法去套用一下蓝图,真的帮助很大
回复

使用道具 举报

     
 楼主| 发表于 2019-5-29 09:46 来自手机 | 显示全部楼层
慕容断月 发表于 2019-5-28 14:49
https://www.unrealengine.com/marketplace/input-buffer

拿好

谢谢大佬,这个正是我需要的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-11-18 20:34 , Processed in 0.020727 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表