控制物体移动的三种方法
一、常规方法
//四个方向
if (Input.GetKey(KeyCode.W))
{
transform.Translate(Vector3.forward*moveSpeed*Time.deltaTime);
}
if (Input.GetKey(KeyCode.S))
{
transform.Translate(Vector3.back * moveSpeed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.A))
{
transform.Translate(Vector3.left * moveSpeed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.D))
{
transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);
}
二、使用unity自带的移动方式
float H = Input.GetAxis("Horizontal");
float V = Input.GetAxis("Vertical");
if (H!=0 || V!=0)
{
transform.Translate(new Vector3(H,0,V)*Time.deltaTime*moveSpeed,Space.World);
}
else
{
//没有移动
}
三、通过刚体控制移动(必须添加刚体)
//通过刚体控制物体移动,需要添加刚体
Vector3 moveForward = Vector3.zero;
if (Input.GetKey(KeyCode.W))
{
moveForward.z += 1;
}
if (Input.GetKey(KeyCode.S))
{
moveForward.z += -1;
}
if (Input.GetKey(KeyCode.A))
{
moveForward.x += -1;
}
if (Input.GetKey(KeyCode.D))
{
moveForward.x += 1;
}
GetComponent<Rigidbody>().MovePosition(Quaternion.LookRotation(transform.forward) * moveForward * moveSpeed * Time.fixedDeltaTime + transform.position);
Unity3D 物体移动方式总结
1. 简介
在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。
2. 通过Transform组件移动物体
Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale)。 其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position)。
2.1 Transform.Translate
该方法可以将物体从当前位置,移动到指定位置,并且可以选择参照的坐标系。 当需要进行坐标系转换时,可以考虑使用该方法以省去转换坐标系的步骤。
public function Translate(translation: Vector3, relativeTo: Space = Space.Self): void;
2.2 Vector3.Lerp, Vector3.Slerp, Vector3.MoveTowards
Vector3 既可以表示三维空间中的一个点,也可以表示一个向量。这三个方法均为插值方法, Lerp为线性插值,Slerp为球形插值, MoveTowards在Lerp的基础上增加了限制最大速度功能。 当需要从指定A点移动到B点时,可以考虑时候这些方法。
2.3 Vector3.SmoothDamp
该方法是可以平滑的从A逐渐移动到B点,并且可以控制速度,最常见的用法是相机跟随目标。
2.4 Transform.position
有时重新赋值position能更快实现我们的目标。
3. 通过Rigidbody组件移动物体
Rigidbody组件用于模拟物体的物理状态,比如物体受重力影响,物体被碰撞后的击飞等等。
注意:关于Rigidbody的调用均应放在FixedUpdate方法中,该方法会在每一次执行物理模拟前被调用。
3.1 Rigidbody.velocity
设置刚体速度可以让物体运动并且忽略静摩擦力,这会让物体快速从静止状态进入运动状态。
3.2 Rigidbody.AddForce
给刚体添加一个方向的力,这种方式适合模拟物体在外力的作用下的运动状态。
3.3 Rigidbody.MovePosition
刚体受到物理约束的情况下,移动到指定点。
4. 通过CharacterController组件移动物体
CharacterController用于控制第一人称或第三人称角色的运动,使用这种方式可以模拟人的一些行为,比如限制角色爬坡的最大斜度,步伐的高度等。
4.1 CharacterController.SimpleMove
用于模拟简单运动,并且自动应用重力,返回值表示角色当前是否着地。
4.2 CharacterController.Move
模拟更复杂的运动,重力需要通过代码实现,返回值表示角色与周围的碰撞信息。
unity物体移动三种方式之——Transform.Translate
在unity中,经常遇到的一个问题就是物体移动的问题,Unity引擎给出了很多种解决方案,这里先给大家介绍一种——Transform.Translate函数。
在Unity中这是最基础的一种物体移动的方式之一,物体会按照你给的速度方程移动。
首先,我们先创建一个场景,加入一个Terrain或者是Plane,这里我加的是Terrain,为了美观,我在Terrain上刷了一层草地,绘制了一个小山包,然后添加一个Sphere,作为我们要移动的对象。新建一个脚本move.cs,绑定到脚本上,并在vs中打开:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class move : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
//使小球按照y轴正方向以每帧1的单位长度移动
transform.Translate(Vector3.up * Time.deltaTime, Space.World);
}
}
效果图:
transform.Translate()函数中,前一个变量是物体的移动速度,这里的速度是一个矢量,既包含大小写包含方向,后一个变量是相对坐标系,这里的相对坐标系有两个值,一个是世界坐标,一个是自身坐标,如果第一个坐标不填写的话,默认为自身坐标系。这里我们将坐标体系修改为自身坐标系看一下效果:
transform.Translate(Vector3.up * Time.deltaTime, Space.Self);
这里我为了看到效果,将小球按照x轴旋转了90°。
我们还可以这样:
transform.Translate(new Vector3 (1,1,1) * Time.deltaTime, Space.World);
通过这个函数,我们可以将控制物体按照任何方向进行移动
unity物体移动三种方式之——AddForceAtPosition(二)
上次介绍了给物体施加力的一个函数AddForcePosition(),介绍了这个函数的三个参数和效果,今天我们继续来介绍这个函数。
这个函数是通过给物体施加力的方式,来使物体运动,我们都学过牛顿三定律,物体的的速度受物体质量的影响,当你用10N的力去推一个质量为1kg的物体和一个100kg的物体的时候(没有阻力的情况下),他们的速度是不相同的。同样,在untiy中,这个道理同样成立,因为unity本来就可以模仿真实世界的受力情况。让我们来看一下。
首先来说,使用 AddForcePosition()函数的物体,本身必须有Rigibody组件,在Rigibody组件中我们可以选择物体是否受重力影响,
第一个红框是代表物体的质量(密度),第二个红框代表是否受重力影响,其他参数,大家可以参考官方文档,可以点击组件右上角的小书(带一个小问号)的按钮即可。
现在,我再代码中将物体质量设置为5,我们来看效果:
我们可以看出小球速度非常快,轻易就击倒了目标,
我们再看看我将小球质量调整为30以后的效果:
小球的速度变得非常慢。
这里我们可以看出质量对于物体的运动速度的影响(恒力条件下),所以,我们在用这个函数的时候,一定要注意物体的质量。
unity物体移动三种方式之——AddForceAtPosition
上次说了物体移动的三种方式中的Transform.Translate,今天我们来说说另外一种方式——AddForceAtPosition()。这种方式是通过给物体目标方向上的一个力,让物体运动,就好比你投篮,给了篮球一个朝向球篮方向的力。
效果如图:
代码如下:
if(Input.GetMouseButton(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit))
{
if(hit.collider.name =="Cube")
{
Vector3 direction = hit.transform.position - obj.transform.position;
//发射炮弹
obj.GetComponent<Rigidbody>().AddForceAtPosition(direction, hit.transform.position,ForceMode.Impulse);
}
}
}
带注释的那一句,就是给小球在hit.transform.position位置上施加一个direction大小的forceMode.Impulse方式的力
函数的官方解释:
public void AddForceAtPosition(Vector3 force, Vector3 position, ForceMode mode = ForceMode.Force);
其中三个参数:
Vector3 force:力(矢量)
Vector3 position:施加力的位置
ForceMode mode :力的方式
额额,差不多就是这样,对于这里函数的使用,大概就是这样,但是在游戏中如果追求更好的模拟真实场景中的效果,大家还是要多多练习,没有实际练习过,你是想象不出效果来的。