一、位移与旋转
一般对物体的位移与旋转操作都是通过修改对象的Transform(变换属性)和Rigidbody(刚体属性)组件参数来实现的。
旋转:
使用Rotate方法
public class BNUTransR : MonoBehaviour {
void Update(){
this.transform.Rotate(2,0,0); /*绕x轴每帧旋转2°(x轴,y轴,z轴)
在Rotate方法中数字为旋转度数而非速度*/
}
}
位移:
使用Translate方法
public class BNUTransT : MonoBehaviour{
void Update(){
this.transform.Translate(0,0,1); //每帧朝z轴方向移动1个单位长度
}
}
关于单位长度的设定在Edit菜单的Snap Settings中。
普通物体和添加了刚体组件的物体都可以使用tranrform变换下的Translate函数进行移动的。不过添加刚体组件的物体具备物理属性,受力后会有移动旋转碰撞,都是通过物理引擎进行计算的,这时这类物体如果再同时使用变换方式进行移动,就会出错。
二、有关时间的方法
在Unity中需要记录时间的功能都需要用到Time类,其中最重要的变量就是deltaTime(为只读变量),它代表了最近一次调用FixedUpdate或者Update方法到现在的时间。
如果想要在不考虑帧率的情况下匀速的完成一个效果,就可以乘以Time.deltaTime。(也就是说帧率会产生影响)
假如物体涉及到了刚体,那么就需要写在FixedUpdate方法中且乘以fixedDeltaTime。(因为Rigidbody涉及到了物理运算,所以要用物理的时间而非以帧率为标准)
例:匀速移动物体的刚体
public class BNUFUpdtae: MonoBehaviour
{
public GameObject gameObject; //声明游戏对象
void FixedUpdate()
{
Vector3 te = gameObject.GetComponent<Rigidbody>().transform.position; //创建一个位置坐标te(向量),把对象的刚体的位置赋予te(获取对象刚体的位置)
te.y += 5 * Time.fixedDeltaTime; //让te每秒上升5个单位
gameObject.GetComponent<Rigidbody>().transform.position = te; //再把te的位置附回给对象的刚体(使刚体移动)
}
}
三、获取其他对象的方法
1.获取带有层次关系的游戏对象
场景中的物体必定存在父子关系,如果想通过脚本来控制父物体或者子物体,就需要用到Transform组件。
获取子物体:transform.Find("子物体名称")
当获取到子物体后,还可以继续通过GetComponent方法来获取子物体的其他组件。
获取父物体:transform.parent
因为一个物体的父物体肯定只有一个,所以不需要根据特定名字来查找。
例:通过查找使子物体和父物体旋转
我们创建三个物体,Cube1、Cube2及Cube3,层级从小到大。
public class BNUParchild : MonoBehaviour
{
void Update()
{
this.transform.Find("Cube1").Rotate(1, 0, 0); //找到子对象Cube1,并将其沿x轴旋转
this.transform.parent.Rotate(1, 0, 0); //找到父对象,并将其沿x轴旋转
}
}
只需将该脚本附挂在Cube2上,即可让父子物体旋转了。
2.通过名字或标签获取游戏对象
GameObject.Find 通过名字获取对象
GameObject.FindWithTag 通过标签获取对象
例:通过查找名字和标签获取对象并使他们旋转
创建两个物体,Cube和Capsule,并给Capsule添加一个Cap标签。
public class BNUFind : MonoBehaviour
{
void Update()
{
GameObject obj1 = GameObject.Find("Cube"); //获取Cube
obj1.transform.Rotate(1, 0, 0);
GameObject obj2 = GameObject.FindWithTag("Cap"); //获取Capsule
obj2.transform.Rotate(1,0,0);
}
}
3.通过组件名来获取游戏对象
FindObjectOfType<组件名称>()和FindObjectsOfType<组件名称>()方法是专门用来查找包含所指定组件的对象的。第一种只能获取到查找到的第一个对象,而第二个可以获取所有包含该组件的对象。
例:打印带有同一个Test脚本组件的对象名称
public class BNUFindtype : MonoBehaviour
{
void Start()
{
Test test = FindObjectOfType<Test>(); //获取第一个找到的“Test”组件
Debug.Log(test.gameObject.name); //打印挂载“Test”组件的第一个游戏对象的名称
Test[] tests = FindObjectsOfType<Test>(); //获取所有的“Test”组件
foreach (Test te in tests)
{
Debug.Log(te.gameObject.name); //打印挂载“Test”组件所有的游戏对象的名称
}
}
}