Unity3D争优——Unity中的运动

本文详细介绍了在Unity中使用Transform.Translate、Rigidbody.velocity、AddForce以及Rotate和RotateAround等方法来控制游戏对象的直线运动和旋转运动,包括示例代码和原理解析。
摘要由CSDN通过智能技术生成

#这是一篇技术普及博客

#对于一篇技术普及博客,我认为应该讲得事无巨细,同时又要通俗易懂

在这里我向大家介绍Unity中几种常用的控制游戏对象运动的方法

直线运动

Transform.Translate(Vector3 translation)

这个也是最常用的控制游戏对象直线运动的方式了。

// 示例代码:将对象在世界空间中沿着指定方向移动
void Update()
{
    float speed = 5.0f;
    Vector3 movement = new Vector3(speed * Time.deltaTime,0.0f,0.0f);
    transform.Translate(movement);
}

完成代码之后将其挂在到游戏对象上,游戏对象就会沿着代码中指定的方向移动了。

Update函数会在游戏运行后的每一帧进行调用,每一帧的时长为Time.deltaTime,我们的speed*Time.deltaTime的作用是为了让我们的速度变成每秒钟走speed所定义的距离,更方便我们控制运动的距离。

利用游戏对象的position属性,transform.position += new Vector3(x,y,z)

这个方法十分简单直接,易于理解。

//实例代码
void Update()
{
    float speed = 5.0f;
    Vector3 movement = new Vector3(speed * Time.deltaTime, 0.0f, 0.0f);
    transform.position += movement;
}

这里实现的效果与前面的相同。

设置Rigidbody.velocity

在使用这个方法前,我们需要给我们的游戏对象加上Rigidbody组件。

//代码示例
void Update()
{
    float speed = 5.0f;
    Vector3 direction = new Vector3(1.0f, 0.0f, 0.0f);
    GetComponent<Rigidbody>().velocity = direction * speed;
}

这里的movement用于控制速度的方向。

Rigidbody.AddForce(Vector3 force)

这个方法模拟了物体在受到一个力之后的运动,可以使物体做加速或减速运动

//代码示例
void Update()
{
    float F = 5.0f;

    Vector3 direction = new Vector3(1, 0, 0);

    GetComponent<Rigidbody>().AddForce(direction * F);
}

此处的F为力的大小,direction为力的方向。

旋转运动

Rotate

我们常常使用这个函数设置游戏对象的自转

//示例代码
void Update()
{
    float speed = 90.0f;
    Vector3 direction = new Vector3(0, 1, 0);
    transform.Rotate(direction * speed * Time.deltaTime);
}

此处speed为角速度,direction为旋转轴的方向。此处代码的意思为,我们的游戏对象以每秒90度的角速度以y轴为旋转轴自转。

RotateAround

我们常常使用这个函数设置游戏对象绕某个物体的公转

//代码示例
void Update()
{
    float speed = 90.0f;
    Vector3 direction = new Vector3(0, 1, 0);
    transform.RotateAround(Vector3.zero, direction, Time.deltaTime * speed);
}

此处Vector.zero为我们的游戏对象要绕着公转的点的坐标,direction为旋转轴的方向,speed为角速度。此处代码的意思为,我们的游戏对象以每秒90度的角速度以y轴为旋转轴绕着坐标原点旋转。

我们可以通过控制游戏对象和公转点的相对位置来控制公转半径的大小。

利用游戏对象的position属性

直接利用游戏对象的position属性,常用于实现游戏对象的公转,公转的半径比较容易控制,但是旋转轴的位置不好控制。

//代码示例
public float progress;
public float speed;
public float radius;
// Start is called before the first frame update
void Start()
{
    progress = 0;
    radius = 3.0f;
    speed = 90.0f;
}

// Update is called once per frame
void Update()
{
    progress = (progress + speed * Time.deltaTime) % 360;
    float x1 = Vector3.zero.x + radius * Mathf.Cos(Mathf.Deg2Rad * progress);
    float y1 = Vector3.zero.y;
    float z1 = Vector3.zero.z + radius * Mathf.Sin(Mathf.Deg2Rad * progress);
    this.transform.position = new Vector3(x1, y1, z1);
}

其中,speed为游戏对象移动的速度,radius为游戏对象公转的半径。代码的意思为,我们的游戏对象以每秒90度的角速度以y轴为旋转轴绕着坐标原点旋转,且公转的半径大小为3。

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值