Unity——#03 Run_2


  这次来解决上节遗留的问题:

1.斜向走移速快40%的问题

  不废话,直接上图:


  图中可以看到,当角色斜向走时,Dmag和forward的值都是1.414,而斜向奔跑时,两者竟达到了2.8多,而Dmag与角色的移动速度有着莫大的关系:

movingVec = pi.Dmag * model.transform.forward * (pi.run ? runSpeed : 1.0f); //移动信息

  这会令玩家更依赖斜向移动来在游戏中赶路,那么其他正向的移动就显得没什么用途了,但在这个问题上并不用分清孰是孰非,只要与你的游戏理念相符,这都是可以的,例如任天堂以前红白机的大部分游戏的斜向移动都是1.414倍移速,没有任何修改(道途听说)。
  不过这在RPG游戏是不可忍受的,平白无故多40%移速加成,这可不能便宜了玩家(雾,所以还是应该对其进行修改。

  我们想做到的就是在坐标是(1,1)的时候,原点距其的距离不是√2,而是转换为1,这就要将(1,1)、(-1,1)、(-1,-1)、(1,-1)这四个坐标组成的正方形转换成矩形(距离上)。要实现正方形到球形变换,这需要两条公式助力,称椭圆映射法:
Eliptical Grid Mapping

  图底下的两条公式就是要用到的公式,其效果就是图中的第二个变换过程,可以看到它把一个正方形转换为一中间看似凸起的圆形,如果在三维上,某一坐标到原点坐标的路径距离(一条曲线)没有变(凸起),但在二维上,距离就已经缩短了。这只是我的理解,可能不对,需高人指点。好摩拳擦掌,把公式转为代码试试看。
  我的做法是,定义一个函数,然后在函数里实现这个椭圆映射的功能。
    Vector2 SquareToCircle(Vector2 temp){
        Vector2 output = Vector2.zero;
        output.x = temp.x * Mathf.Sqrt (1 - (temp.y * temp.y) / 2);
        output.y = temp.y * Mathf.Sqrt (1 - (temp.x * temp.x) / 2);
        return output;
    }

  接下来就是要调用它,我们原本的坐标是Dup跟Dright,调用SquareToCircle时要喂给它吃,然后定义一临时Vector2变量去接其返回出来的值:

        Vector2 tempDAxis = SquareToCircle (new Vector2 (Dup, Dright));

        float Dup2 = tempDAxis.x;
        float Dright2 = tempDAxis.y;

        Dmag = Mathf.Sqrt (Dup2 * Dup2 + Dright2 * Dright2);
        Dvec = Dup2 * transform.forward + Dright2 * transform.right;

  我们新定义了两个float的变量Dup2和Dright2来接临时变量的值,然后再计算Dmag(速度)跟Dvec(移动方向),这时movingVec的值也会跟着变化。事不宜迟,赶紧看看效果如何:
Dmag = 0.99999

  现在无论是走还是跑Dmag都不会超过1,可喜可贺可喜可贺。

2.平滑起跑

  上节中遗留的另外一个问题就是在走到跑的动画切换时,没有过渡,立马跑起来,这很不流畅。解决这个问题要用到之前提到的概念——插值,不过上次用的是球形插值,这次可以用线性插值,因为两离散点间不会经过零点(1到2),所以不用考虑绕开零点。
  线性插值应该用Mathf.Lerp(),每遇到一个新函数,都要看看官网的描述,看它能干嘛,怎么用最好:

public static float Lerp(float a, float b, float t);
Returns
float The interpolated float result between the two float values.

Description
Linearly interpolates between a and b by t.

The parameter t is clamped to the range [0, 1].

When t = 0 returns a.
When t = 1 return b.
When t = 0.5 returns the midpoint of a and b.

  能实现线性插值,吃三个参数,前两个定义一个范围(between a and b),而t是用来表示完成这个过程的程度,t = 0.5时返回a跟b的中点。那么如何实现两点间的逐渐靠近以致a最终渐变到b呢?调用方式为a=Lerp(a,b,t);,在经过多次Update()之后,把a渐变成b。这里很容易会有一个误区就是认为参数t是完成这个过程的时间,认为t = 1就是在1秒内完成a到b的渐变,一开始我也是这么理解的,后来发现是错的。实现代码如下:

        float temp = Mathf.Lerp(anim.GetFloat("forward"),pi.Dmag*(pi.run?2.0f:1.0f),0.5f);
        anim.SetFloat("forward", temp);

  首先要做的就是把当前的forward值取出来作为区间起点,把玩家移动的信号反馈做区间的终点,这样无论是forward从2变1或0还是从0或1变2都能照顾到。定义一临时变量是能理清思路,知道自己该做什么,测试无误后,就把它取消,合并代码。

        anim.SetFloat("forward", Mathf.Lerp(anim.GetFloat("forward"),pi.Dmag*(pi.run?2.0f:1.0f),0.1f));

  我把渐进的程度设为0.1,这样效果明显一点:


Run

  能看出来,现在起跑的动作连贯很多,看角色的左手起跑时的摆动就很流畅自然。如果没做平滑处理呢,角色的左手是上一刻在自己的胸前,下一刻就已经在大腿外侧了,没有这个摆动的动作的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容