Unity中的物体移动


一、局部坐标 && 世界坐标 的区别

  1. 局部坐标系(Transform.localPosition)是指当前物体相对于父物体的位置,会受到父物体的影响。
  2. 世界坐标系(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()实现对刚体物体施加力的效果,实现物体例如碰撞,爆炸等等效果

  • 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);
    }

特点:游戏对象移动时不是匀速的,而是变速运动,会由快而慢,最后一部分数值甚至会一直都达不到

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);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_53163894/article/details/126751375