1.player input
具体的过程为player input-> signal
要将输入转化成 双轴信号
代码如下所示
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+左键,多行编辑
- 变量
- 一次性代码
- 重复性代码
3. blender tree
blend tree的属性名称修改要在以下位置修改,否则会报错说paramter**不存在
4.awake和start
https://blog.csdn.net/puppet_master/article/details/50975186
5.摇杆控制
选取坐标距离原点的长度值作为参数值,来控制动画的状态。
具体的代码如下:
/* 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
-
freeze the rotation
要注意锁定旋转,否则角色容易倒地抽搐
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,即根号的值。也就会使得斜方向行走会变成奔跑动画。
那么这里就可以使用椭圆公式,将直角坐标系转化为圆坐标系。
公式如下:
可以直接使用c#的ref来更改。
10. 角色跳跃
如下所示,使用getkey会需要判断按键是按下还是弹起,比较麻烦,所以可以直接使用getkeydown函数。