Unity_角色移动_Translate

角色移动的方式有很多种,比如transform自带的translate,或者物理引擎添加力Rigidbody.AddForce,再或者Lerp插值使用曲线,或导航系统或动画系统以及各种插件例如CharacterController的move和simplemove等等,其中物理引擎通过施加力的方式移动,这里不懂得可以去查一下牛顿运动定律啦~,Translate以及Lerp都是通过更改角色的位置、旋转、缩放去达到移动的效果,而插件则不同这里不做举例。

这里我们介绍简单的几种方式,剩下的方式后续陆续补充。

一、获取鼠标键盘输入方式

这里介绍常用的获取方式:

1.使用Input.GetKey或Input.GetKeyDown或Input.GetKeyUp获得键盘各个按键,其中GetKey为按键持续按压,GetKeyDown为点击一次,GetKeyUp为抬起一次。例如获取按键A单机一下为:

Input.GetKeyDown(KeyCode.A);

2.按下图找到ImputManager的Axes:

里面包含了例如水平轴输入Horizontal,竖直Vertical以及鼠标信息等,其中可以自己设置输入方式

在代码中的获取方式为:

 float horizontal = Input.GetAxisRaw("Horizontal");
 float vertical = Input.GetAxisRaw("Vertical");

注意一定要将GetAxisRaw(“”");双引号里面的名字写对,区分大小写。其中GetAxisRaw不做平滑处理而GetAxis做平滑处理,我希望我的移动精准控制,所以使用GetAxisRaw。

一、Translate

float horizontal = Input.GetAxisRaw("Horizontal");
float vertical = Input.GetAxisRaw("Vertical");
if (vertical > 0)
{
    this.gameObject.transform.Translate(MoveSpeed*Time.deltaTime*up);
}
if (vertical < 0)
{
    this.gameObject.transform.Translate(MoveSpeed * Time.deltaTime * -up);
}
if (horizontal > 0)
{
    this.gameObject.transform.Translate(MoveSpeed * Time.deltaTime * Vector3.right);
}
if (horizontal < 0)
{
    this.gameObject.transform.Translate(MoveSpeed * Time.deltaTime * Vector3.left);
}

获取键盘输入后判断按键的方向,例如水平轴>0那一定是向右移动,因为GetAxisRaw返回[-1,1]的值。

如果向右移动则:让物体的Transform组件的Translate方法移动。这里movespeed代表移动速度,Time.deltaTime为一秒,right为Vector(1,0,0)。所以参数为速度乘以时间沿right方向前进,其他原理相同。

二、物理引擎

1.直接设置速度
Vector3 move = new Vector3(Input.GetAxis("Horizontal"), 0f, Input.GetAxis("Vertical")); rigidbody.velocity = new Vector3(move.x * moveSpeed, rigidbody.velocity.y, move.z * moveSpeed);  
2.施加力加速度
rigidbody.AddForce(new Vector3(forceX, 0f, forceZ), ForceMode.Impulse);

上面施加了一个瞬时力让他移动。

具体放到物理引擎一章一并发出。

三、Lerp

对于Lerp的平滑处理有一个坑:

Vector3.Lerp(this.transform.position, 目标位置, Time.deltaTime);

问题在于平滑处理时候他会让对象无限接近目标位置,但永远不会完全到达,所以你会发现他的移动慢->快->慢的方式,有点像芝诺的乌龟。这里有两种方法解决,一种是使用曲线解决,一种是让插值因子不断改变一直相对于当前位置与目标位置的固定值。

具体结局方法与导航、动画系统等放到后续进行详细解释。如果需要可以评论优先发出。

四、CharacterController

因为上面提到了CharacterController,这里提个醒就是他与物理引擎尽量不要一起使用否则造成角色移动乱象。

结尾:

本篇针对我的文章“小地图”发出,具体各项补充稍缓。

有任何错误请指出,补充请评论,看到会第一时间回复,谢谢。

  • 32
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 您好,我可以回答这个问题。Unity2D角色移动可以通过编写脚本来实现。您可以使用Input.GetAxis函数获取水平和垂直输入,然后使用Transform.Translate函数将角色移动到新的位置。您还可以使用Rigidbody2D组件来实现更流畅的移动。希望这可以帮助您。 ### 回答2: Unity中2D角色移动可以通过以下几种方式实现: 1. 使用刚体组件(Rigidbody2D):将刚体组件添加到角色对象中,然后通过代码控制刚体的速度(rigidbody2D.velocity)或者力(rigidbody2D.AddForce)进行角色移动。可以通过键盘输入或者触摸输入来控制角色移动方向。 2. 使用Transform组件:直接通过修改角色对象的Transform组件中的position属性,来改变角色的位置。可以使用键盘输入或者触摸输入来控制角色移动方向。 3. 使用Translate方法:在更新角色移动的函数中,使用Translate方法来改变角色的位置,可以通过键盘输入或者触摸输入来控制角色移动方向。 4. 使用CharacterController组件:将CharacterController组件添加到角色对象中,然后通过代码控制CharacterController的Move函数来改变角色的位置。可以通过键盘输入或者触摸输入来控制角色移动方向。 需要注意的是,以上方法都需要在Update函数中进行角色移动的操作,并且要根据游戏需求进行相应的优化,例如添加碰撞检测、地图边界限制等。另外,角色移动过程中还可以结合动画、音效等来提高游戏的表现力和用户体验。 ### 回答3: 在Unity 2D中,角色移动可以通过几种不同的方法来实现。其中最常用的方法是使用Rigidbody2D组件来控制角色移动。 首先,需要在角色对象上添加Rigidbody2D组件。然后,可以通过编写脚本来控制角色移动。以下是一个简单的示例脚本: ``` using UnityEngine; public class PlayerMovement : MonoBehaviour { public float moveSpeed = 5f; // 角色移动速度 private Rigidbody2D rb; private void Start() { rb = GetComponent<Rigidbody2D>(); } private void Update() { float moveHorizontal = Input.GetAxis("Horizontal"); // 获取水平方向的输入 float moveVertical = Input.GetAxis("Vertical"); // 获取垂直方向的输入 Vector2 movement = new Vector2(moveHorizontal, moveVertical); // 构建角色移动的向量 rb.velocity = movement * moveSpeed; // 设置角色的速度 } } ``` 在这个示例中,我们首先获取用户的水平和垂直输入,并将其构建为一个向量。然后,通过将该向量与移动速度相乘,我们得到了角色的速度。最后,我们使用Rigidbody2D组件的velocity属性来设置角色的速度。 通过调整moveSpeed变量的值,可以改变角色移动速度。你也可以根据自己的需求来修改脚本,以满足不同的移动需求,如斜向移动、限制移动范围等。 以上就是使用Rigidbody2D组件来实现Unity 2D角色移动的简单示例。希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值