一、局部坐标 && 世界坐标 的区别
- 局部坐标系(Transform.localPosition)是指当前物体相对于父物体的位置,会受到父物体的影响。
- 世界坐标系(Transform.Position)是指当前物体在世界空间坐标系中的位置,不受父物体影响。
若该物体有父类,则二者的关系为:该物体的世界坐标=该物体父类的世界坐标+该物体的局部坐标。
另外需要注意的一点是:unity的Hierarchy面板中所显示的position是局部坐标。若无父物体也是世界坐标。
二、Unity中常用的物体移动方法
①.利用Transform组件
1.Vector3
public float speed = 5f;
void Update()
{
this.gameObject.transform.LocalPosition +=new Vector3(0,0,speed*Time.deltaTime)
}
2.Vector3.MoveTowards
public float speed = 5f;
void Update()
{
this.gameObject.transform.LocalPosition = new Vector3.MoveTowards(this.gameObject.transform.LocalPosition,new Vector3(0,0,10),speed*Time.deltaTime)
}
3.用键盘控制
public float speed = 5f;
void Update
{
if (Input.GetKeyDown(KeyCode.W)) //上移
{
transform.Translate(Vector3.up * speed * Time.deltaTime);
}
if (Input.GetKeyDown(KeyCode.S)) //下移
{
transform.Translate(Vector3.down * speed * Time.deltaTime);
}
if (Input.GetKeyDown(KeyCode.A)) //左移
{
transform.TranslateDown(Vector3.left * speed * Time.deltaTime);
}
if (Input.GetKeyDown(KeyCode.D)) //右移
{
transform.Translate(Vector3.right * speed * Time.deltaTime);
}
//使用上下方向键或者W、S键来控制前后移动
float translation = Input.GetAxis("Vertical") * speed * Time.deltaTime;
//使用左右方向键或者A、D键来控制左右旋转
float rotation = Input.GetAxis("Horizontal") * rotationSpeed * Time.deltaTime;
}
注意:
- Input.GetAxis() ————返回值从-1到1之间
- Input.GetAxisRaw() ———— 返回值为-1,0,1这三个值。
4.通过rigibody组件移动物体
1.Rigidbody.velocity
public float speed = 5f;
void Update ()
{
gameObject.GetComponent<Rigidbody>().velocity = Vector3.forward * Speed;
}
2.Rigidbody.AddForce
在unity中,Rigidbody.AddForce()实现对刚体物体施加力的效果,实现物体例如碰撞,爆炸等等效果文章来源:https://www.toymoban.com/news/detail-772637.html
- Force:将输入解释为力(以牛顿为单位测量),并通过力的值 * DT / 质量来改变速度。效果取决于模拟步长和身体质量。——添加一个可持续力到刚体,使用它的质量
- Acceleration:将参数解释为加速度(以米/秒平方为单位测量),并通过力值 * DT 更改速度。效果取决于模拟步长,但不取决于身体的质量。——添加一个可持续加速度到刚体,忽略它的质量。
- Impulse:将参数解释为脉冲(以牛顿每秒为单位测量),并通过力/质量的值改变速度。效果取决于身体的质量,但不取决于模拟步长。——添加一个瞬间冲击力到刚体 ,使用它的质量。( 爆炸或碰撞力量 )
- VelocityChange:将参数解释为直接速度变化(以米每秒为单位测量),并通过力值更改速度。效果不依赖于主体的质量或模拟步长。——添加一个瞬间速度变化给刚体,忽略它的质量。
public Rigidbody2D rb;
public float speed = 5f;
void Update()
{
rb.AddForce(new Vector3(0f, 0f, speed), ForceMode.Impulse);
}
三、运用插值运算移动物体
1.使用Lerp插值运算移动物体
public float speed = 5f;
void Update()
{
//使用插值运算将对象移动到(0,0,10)
this.gameObject.transform.LocalPosition = new Vector3(0,0,mathf.Lerp(this.gameObject.transform.LocalPosition.z,10,speed*Time.deltaTime));
//补充
//平滑地移动摄像机朝向目标位置(可用于摄像机)
gameobject.transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime);
}
特点:游戏对象移动时不是匀速的,而是变速运动,会由快而慢,最后一部分数值甚至会一直都达不到文章来源地址https://www.toymoban.com/news/detail-772637.html
2.通过线性插值的方式来逐渐改变物体的颜色
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ColorChange : MonoBehaviour
{
private MeshRenderer MR;
private float speed = 5f;
void Start () {
// 设置物体的初始颜色
MR= GetComponent<MeshRenderer>().material.color = Color.green;
}
void Update () {
//初始颜色 目标颜色 速度
MR.material.color = Color.Lerp(MR.material.color, Color.blue, speed * Time.deltaTime);
}
}
到了这里,关于Unity中的物体移动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!