本篇文章主要介绍游戏对象的移动、旋转与缩放;
再通过实例进行演示与实际操作;
************************************************************************************************************************************
一:游戏对象的移动
<1> 游戏对象的位置
在3D世界中,任何一个模型的三维坐标都是保存在Vector3容器中,该容器记录了物体的x轴、y轴和z轴方向的坐标;
<2> 移动游戏对象
游戏对象在原有基础上继续移动,在代码中可以使用transform.Translate()函数来实现,该函数的唯一参数是位移的数值(偏移量):
transform.Translate(Vector3 offset)
该语句相当于:transform.position = transform.position+offset (提前声明 Vector3 offset)
<3>实例操作(使用点击UI进行移动)
创建一个cube,编写脚本移动到任意一个GameObject上,运行:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move_Cube : MonoBehaviour {
public GameObject cube;
void OnGUI()
{
if(GUILayout.Button("向左移动物体"))
{
cube.transform.Translate(new Vector3(-0.5f, 0f, 0f));
}
if(GUILayout.Button("向右移动物体"))
{
cube.transform.position += new Vector3(0.5f, 0f, 0f);
}
}
}
<3-1> 测试结果
<4> 实例操作(使用WASD键来控制移动)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move_Cube : MonoBehaviour {
public GameObject cube;
void OnGUI()
{
if(GUILayout.Button("向左移动物体"))
{
cube.transform.Translate(new Vector3(-0.5f, 0f, 0f));
}
if(GUILayout.Button("向右移动物体"))
{
cube.transform.position += new Vector3(0.5f, 0f, 0f);
}
}
void Update()
{
if(Input.GetKeyDown(KeyCode.A))
{
cube.transform.Translate(new Vector3(-0.5f, 0f, 0f));
}
if(Input.GetKeyDown(KeyCode.D))
{
cube.transform.Translate(new Vector3(0.5f, 0f, 0f));
}
if(Input.GetKeyDown(KeyCode.W))
{
cube.transform.Translate(new Vector3(0f, 0.5f, 0f));
}
if(Input.GetKeyDown(KeyCode.S))
{
cube.transform.Translate(new Vector3(0f, -0.5f, 0f));
}
}
}
<5> 另外一种移动游戏对象的操作
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
float d = Input.GetAxis("Mouse ScrollWheel");
cube.transform.Translate(new Vector3(h,v,d)*Time.deltaTime);
Input.GetAxies()函数在不停对方向键进行监控,其值域的绝对值在[0,1]之间改变,松开最后归零;
这里的Translate()函数每帧都会执行一次,而deltaTime表示每帧所需要的时间:
例如,transform.Translate(new Vector3(0f,10f,0f)),因为该部分在Update()下,所以每一帧会刷新一次,也就表示每一帧会移动10m,
而一般情况下我们的电脑是60fps(一秒60帧)一秒这个游戏物件就会移动600m,一转眼间这个游戏物件就不知道跑到什么地方去了。
这里的deltaTime则会根据实际情况确认帧数,取帧数的倒数(60帧对应1/60),乘以这个值会使得物体在秒的层级上进行移动(一秒10m),而不是按照帧来移动。
二:游戏对象的旋转
Vector3.right:X轴正向
Vector3.up:Y轴正方向
Vector.forward:Z轴正方向
<1> 设置游戏物体围绕自身进行旋转
GameObject A.transform.Rotate( new Vector3(xx,xx,xx))
<2> 设置游戏物体围绕另一个对象进行旋转(参数的含义在下方代码中有注释)
GameObject A.transform.RotateAround(GameObject B.transform.position,vector.up,10f)
<3> 实例操作
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Rotate_Cube : MonoBehaviour {
public GameObject cube;
public GameObject sphere;
public int Rotate_Speed = 20;
void OnGUI()
{
if(GUI.Button(new Rect(100,100,100,50),"旋转物体"))
//if(GUILayout.Button("旋转物体"))
{
//cube.transform.Rotate(new Vector3(0f, 10f, 0f));
cube.transform.RotateAround(sphere.transform.position,Vector3.up,10f); //注意这里的参数,第二个表示方向,第三个参数表示角度
}
}
// Update is called once per frame
void Update () {
//持续围绕y轴进行顺时针旋转
// cube.transform.rotation = Quaternion.Euler(0f, Rotate_Speed*Time.time, 0f);
}
}
<4> 测试结果
三:游戏对象的缩放
在Unity中,可以通过代码来动态地缩放游戏中的游戏对象:
tramsform.localScale = new Vector3(x,y,z);
其中Vector3的x为x轴向上的缩放,y为y轴向上的缩放,z为z轴上的缩放;
也可以使用下面的代码来进行整体的缩放:
transform.localScale *= 1.2f; //游戏物体三个轴向均放大1.2倍
<1> 实例操作
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Rotate_Cube : MonoBehaviour {
public GameObject cube;
public GameObject sphere;
public int Rotate_Speed = 20;
void OnGUI()
{
if(GUI.Button(new Rect(100,100,100,50),"旋转物体"))
//if(GUILayout.Button("旋转物体"))
{
//cube.transform.Rotate(new Vector3(0f, 10f, 0f));
cube.transform.RotateAround(sphere.transform.position,Vector3.up,10f); //注意这里的参数,第二个表示方向,第三个参数表示角度
}
if(GUI.Button(new Rect(100,150,100,50),"放大物体"))
{
cube.transform.localScale *= 1.2f;
}
if(GUI.Button(new Rect(100,200,100,50),"缩小物体"))
{
cube.transform.localScale *= 0.8f;
}
}
// Update is called once per frame
void Update () {
//持续围绕y轴进行顺时针旋转
// cube.transform.rotation = Quaternion.Euler(0f, Rotate_Speed*Time.time, 0f);
}
}
<2> 测试结果