#这是一篇技术普及博客
#对于一篇技术普及博客,我认为应该讲得事无巨细,同时又要通俗易懂
在这里我向大家介绍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。