darksouls tutorial1

1.player input

具体的过程为player input-> signal

darksouls tutorial1_第1张图片
图片.png

要将输入转化成 双轴信号
darksouls tutorial1_第2张图片
图片.png

代码如下所示

    void Update()
    {
        Dup = (Input.GetKey(keyUp) ? 1.0f : 0) - (Input.GetKey(keyDown) ? 1.0f : 0);
        Dright = (Input.GetKey(keyRight) ? 1.0f : 0) - (Input.GetKey(keyLeft) ? 1.0f : 0);
    }

然后以此为基础调用dampsmooth方法,最终代码如下

    void Update()
    {
        targetDup = (Input.GetKey(keyUp) ? 1.0f : 0) - (Input.GetKey(keyDown) ? 1.0f : 0);
        targetDright = (Input.GetKey(keyRight) ? 1.0f : 0) - (Input.GetKey(keyLeft) ? 1.0f : 0);
        Dup = Mathf.SmoothDamp(Dup,targetDup,ref velocityDup, 0.1f);
        Dright = Mathf.SmoothDamp(Dright, targetDright, ref velocityDright, 0.1f);
    }

不过在调试过程中,直接关闭改脚本会使得参数变得混乱,所以要使用soft button,具体的代码如下

//variance
public bool inputEnabled = true;
//in update
        if (!inputEnabled)
        {
            Dup = 0;
            Dright = 0;
        }

2.代码格式

shitf+alt+左键,多行编辑

  1. 变量
  2. 一次性代码
  3. 重复性代码

3. blender tree

blend tree的属性名称修改要在以下位置修改,否则会报错说paramter**不存在


darksouls tutorial1_第3张图片
图片.png

4.awake和start

https://blog.csdn.net/puppet_master/article/details/50975186

5.摇杆控制

选取坐标距离原点的长度值作为参数值,来控制动画的状态。


darksouls tutorial1_第4张图片
图片.png

具体的代码如下:

/* playerinput中 */
        //control model animation
        Dmag = Mathf.Sqrt((Dup) * (Dup) + (Dright) * (Dright));
        //control model direction
        Dforward = Dup * transform.forward + Dright * transform.right;
/* actorcontroller中 */
        anime.SetFloat("forward", pi.Dmag);
        //set threshold for direction change
        if(pi.Dmag > 0.1)
        {
            model.transform.forward = pi.Dforward;
        }

但是因为斜方向移动magnitude会达到根号2,也就会使得斜方向的移动速度大于直行的速度。

6. transform.forward和vector3.forward

https://www.cnblogs.com/ttxhxz/p/9553964.html

7.角色移动

1.rigidbody

  1. freeze the rotation
    要注意锁定旋转,否则角色容易倒地抽搐


    图片.png

2.在fixedUpdate中更新rigidbody的状态,因为物理效果每60帧中更新50次

3.velocity和position
在控制角色移动的时候,有两种方法

        moveVec = pi.Dmag * model.transform.forward;
        //第一种
        //rigid.position += moveVec * Time.fixedDeltaTime*walkSpeed;
        //第二种
        rigid.velocity = moveVec * walkSpeed;

其中第二种会导致爬坡的时候,在下坡时浮空。这是因为他把速度改变的只会沿着一个方向行进。
所以修改方法为合并两个方向的速度(按键方向和重力方向)

rigid.velocity = new Vector3(moveVec.x,rigid.velocity.y,moveVec.z);

8. 奔跑动画

奔跑动画就是在animator的blend tree中再加入奔跑的状态。设置这个奔跑的状态为2。
然后使用判断语句控制forward的值即可:

pi.Dmag * (pi.run ? 2.0f : 1.0f);

9.插值

但这样子的话,mag的值的变化就是过于突兀。
那么这里使用lerp线性插值来让mag的值渐变。

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

此外还可以使用slerp插值(圆形插值),来让旋转角度变得更顺滑

        //set threshold for direction change
        if(pi.Dmag > 0.1f)
        {
            //change character direction
            model.transform.forward = Vector3.Slerp(model.transform.forward, pi.Dforward,0.4f);
        }

9.坐标系转化

因为是直角坐标系,mag在斜方向的最大值可以达到1.4,即根号的值。也就会使得斜方向行走会变成奔跑动画。
那么这里就可以使用椭圆公式,将直角坐标系转化为圆坐标系。
公式如下:


darksouls tutorial1_第5张图片
图片.png

可以直接使用c#的ref来更改。

10. 角色跳跃

如下所示,使用getkey会需要判断按键是按下还是弹起,比较麻烦,所以可以直接使用getkeydown函数。


darksouls tutorial1_第6张图片
图片.png

你可能感兴趣的:(darksouls tutorial1)