在Unity中写一个妥妥贴贴的ARPG移动系统(二)

(1.这里写的移动系统包括角色的移动以及摄像机的移动 2.不包括动画部分 3.本人是根据b站“傅老师”的黑魂复刻视频写的这个移动系统,所以高度相似)

动作控制器

输入输出模块做完后我们新建一个脚本开始做动作控制器了

//定义
public PlayerInput pi;

//获取
void Awake()
{
   
    pi = GetComponent<PlayerInput>();
}

首先我们要获得之前的输入输出模块,考虑到动作控制器和输入输出模块应该是挂在同一物体上,我们直接在Awake里面获取。然后我们就可以开始调整角色的朝向了。

//获取人物模型
public GameObject model;

//让模型转向
void Update()
{
   
    model.transform.forward = pi.Dright * transform.right + pi.Dup * transform.forward;
}

这里有一个要注意的点,你的脚本不能挂在角色模型上,不然你的角色模型的坐标就会转动,比方说角色模型收到的指令是转向它的右手边,可是它的右手在它转动的时候也在转动,那么就会出现“小狗追尾巴的效果”,会鬼畜的大旋转。
好的现在我们的转向还需要处理两个问题:1.运行后我们会发现,在我们松开按键之后一会儿角色的朝向会回到初始的方向,这是由于角色的Dup或Dright值此时开始衰减,两者都为零之后公式算出的model.transform.forward值就变成了0,也就是初始方向。2.当我们一个一个按下方向键时,会看到角色的转向会突变,让人看起来很不爽。
那么我们现在来解决这两个问题。
问题一的解法很简单,既然是衰减到零惹得祸,那么我们只要让转向只在Dup或Dright的值大于0时执行就好了,所以我们可以这样做:

if (Mathf.Sqrt((pi.Dup * pi.Dup) + (pi.Dright * pi.Dright)) > 0.1f)
{
   
    model.transform.forward = pi.Dright * transform.right + pi.Dup * transform.forward;
}

问题二呢,则需要我们进一步更改一下代码:

if (Mathf.Sqrt((pi.Dup * pi.Dup) + (pi.Dright * pi.Dright)) > 0.1f)
{
   
	Vector3 Dvec = pi.Dright * transform.right + pi.Dup * transform.forward;
	model.transform.forward = Vector3.Slerp(model.transform.forward, Dvec,0.5f);
}

Slerp是用于Vector3中的插值函数,其特点是会使两个向量在球面上进行插值。

好的现在呢我们开始做模型的位移部分,这一部分我们还是用刚体来实现。
所以先定义并且在Awake里面获取吧。

private Rigidbody rigid;

void Awake()
{
   
    rigid = GetComponent<Rigidbody>();
}

由于Rigidbody无法在Updata里面调用,所以我们对它的操作将在FixedUpdata里面进行。(物理引擎是每秒50次模拟,与Updata函数的运行速度不一样)

public float walkSpeed = 2.0f;
private Vector3 movingVec;

void Updata()
{
   
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值