前文:https://blog.csdn.net/Jaihk662/article/details/86750789(Transform组件)
https://blog.csdn.net/Jaihk662/article/details/86754532(利用Transform组件移动物体)
PS:注释和讲解部分在代码中
一、Rigidbody组件
刚体(Rigidbody)就是具有物理属性的物体,拥有重力,会自由落体等
选中游戏物体→Component→Physics→Rigidbody,该物体就会成为刚体,可以像现实中的物体一样运动
刚体组件基础属性:
- Mass:设置物体的质量,也就是重量(单位KG)
- Drag:空气阻力(0表示无阻力,值很大时物体会停止运动)
- Angular Drag:角阻力,受到扭曲力时的空气阻力(0表示无阻力,值很大时物体会停止运动)
- Use Gravity:是否使用重力,如果不使用重力,物体则不会自由落体
角阻力大小演示(下面方块空气阻力为10,上面方块无空气阻力):
前者上面方块角阻力为500,后者上面方块角阻力为0.05
二、利用Rigidbody组件移动物体
注:物体向前移动不但可以通过 Vector3.forward,还可以直接定义向量,也就是 new Vector3(0,0,1),其它同理
例如 new Vector3(1,0,1) 就是往右前方移动
myTransform.Translate(new Vector3(0,0,1), Space.Self);
利用Transform组件移动物体虽然会受到重力影响,但是物体可以随意穿模,如下
使用刚体移动物体相关方法:
myRigidbody.MovePosition(当前位置+方向),获取当前位置使用 Transform.Position
使用刚体移动物体,物体是默认根据世界坐标系的方向移动的,并且会触发物理相关的事件,例如与场景中的其它物体发生碰撞
例子代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Text1: MonoBehaviour
{
//因为Start()只会在开始游戏时被执行一次,所以一般都用来初始化
private Transform myTransform; //实例化Transform对象
private Rigidbody myRigidbody;
void Start()
{
Debug.Log("Start"); //输出调试
myTransform = gameObject.GetComponent<Transform>(); //获取相应对象的引用
myRigidbody = gameObject.GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Z) || Input.GetKey(KeyCode.Z)) //Z+WASD控制上下左右移动
{
if (Input.GetKeyDown(KeyCode.W))
{
Debug.Log("W键按下,向前移动");
myTransform.Translate(new Vector3(0,0,1), Space.Self); //向前移动的另一种表述形式,下同
}
if (Input.GetKeyDown(KeyCode.A))
{
Debug.Log("A键按下,向左移动");
myTransform.Translate(new Vector3(-1,0,0), Space.Self);
}
if (Input.GetKeyDown(KeyCode.S))
{
Debug.Log("S键按下,向后移动");
myTransform.Translate(new Vector3(0,0,-1), Space.Self);
}
if (Input.GetKeyDown(KeyCode.D))
{
Debug.Log("D键按下,向右移动");
myTransform.Translate(new Vector3(1,0,0), Space.Self);
}
}
else //如果不压住Z键(注意这个是无视大小写的)
{
if (Input.GetKeyDown(KeyCode.W))
{
Debug.Log("刚体向前移动");
myRigidbody.MovePosition(myTransform.position + (new Vector3(0, 0, 1)));
}
if (Input.GetKeyDown(KeyCode.A))
{
Debug.Log("刚体向左移动");
myRigidbody.MovePosition(myTransform.position + (new Vector3(-1, 0, 0)));
}
if (Input.GetKeyDown(KeyCode.S))
{
Debug.Log("刚体向后移动");
myRigidbody.MovePosition(myTransform.position + (new Vector3(0, 0, -1)));
}
if (Input.GetKeyDown(KeyCode.D))
{
Debug.Log("刚体向右移动");
myRigidbody.MovePosition(myTransform.position + (new Vector3(1, 0, 0)));
}
}
}
}
不过测试到这里,你会发现好像使用刚体移动物体仍然会穿模,和使用变换组件没有任何区别?
因为这取决于碰撞体组件的设置,所以具体实现要看后面的文章了