本篇文章主要介绍游戏对象的移动旋转缩放

再通过实例进行演示与实际操作;

************************************************************************************************************************************

 

一:游戏对象的移动

<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> 测试结果

unity中gameobject和trasfrom_System

<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中gameobject和trasfrom_缩放_02

 

 

三:游戏对象的缩放

在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> 测试结果

unity中gameobject和trasfrom_Time_03