Unity的几个常用的基本的类,即API
预制件的使用会提高开发的效率,如下箭头1所指即为预制件,箭头2 为该预制件的实例
1、Component 类继承自上面的父类,则父类中的方法在Component类,及继承自Component类的子子类中仍然可以使用。
public class ComponentDemo : MonoBehaviour
{
private void OnGUI()
{
if (GUILayout.Button("按钮"))
{
print("Ok,YOU have click this button");
}
}
}
2、 GetComponent<>() 为获取当前物体的某一组件
public class ComponentDemo : MonoBehaviour
{
private void OnGUI()
{
if (GUILayout.Button("按钮"))
{
print("Ok,YOU have click this button");
this.transform.position = new Vector3(17, 0, 13);
// this指当前的脚本(即ComponentDemo),也可以省略。
// GetComponent<>()为获取当前物体的某一个组件,即在一个脚本中使用另一个脚本的内容
// MeshRenderer 为要使用的组件,material.color为该组件中的属性
this.GetComponent().material.color = Color.red;
}
}
}
3、GetComponents
public class ComponentDemo : MonoBehaviour
{
private void OnGUI()
{
if (GUILayout.Button("GetComponents"))
{
// 获取当前物体的所有组件
var allComponent = this.GetComponents();
//将获取到的组件输出显示在控制台上
foreach(var x in allComponent)
{
print(x.GetType());
}
}
}
}
(一)、属性
1、position :变换的世界坐标
2、localPosition:子物体变换的位置相对于父物体的变换,指的是子物体相对于父物体的坐标。
private void OnGUI()
{
if (GUILayout.Button("GetComponents"))
{
// 物体相对于世界坐标系原点的位置
Vector3 worldpos= this.transform.position;
// 物体相对父物体轴心点的位置
Vector3 localpos = this.transform.localPosition;
print(worldpos);
print(localpos);
}
}
类似的还有 rotation、localPosition、localScale
(二)、方法
1、 Rotate ———— 旋转
(1)、该脚本设置的绕Y周旋转指定角度的用法
public class ComponentDemo : MonoBehaviour
{
private void OnGUI()
{
if (GUILayout.Button("Rotate01"))
{
//沿自身坐标系Y轴旋转60度
this.transform.Rotate(0, 60, 0);
}
if (GUILayout.Button("Rotate02"))
{
//沿世界坐标系Y轴旋转30度
this.transform.Rotate(0, 30, 0, Space.World);
}
}
}
(2)、旋转的其它用法总结:
当transform.Rotate(a,b,c) 函数有三个参数时: a表示旋转轴,绕哪个轴旋转;b表示旋转速度,一般用角度来表示;
c表示绕自身坐标系旋转还是世界坐标系(一般缺省为绕自身Space.Self,绕世界坐标系时需要设置为Space.World)
transform.Rotate(d,e) 函数也可以只有两个参数,第一个参数表示旋转轴和旋转角度,为矢量;第二个参数e为所在的坐标系,可以缺省。
1、在不声明public变量的情况下,直接使用旋转角度的几种表示方式,在Update ()函数中:
//方法一:Vector3.up表示沿y轴正方向。物体在自身坐标系下以y轴为中心,每帧旋转10度。
transform.Rotate(Vector3.up,10,Space.Self);
//方法二:物体在自身坐标系下以y轴为中心,每帧旋转10度。
transform.Rotate(Vector3.up*10,Space.Self);
//方法三:物体在自身坐标系下,以z轴为旋转轴,每帧旋转10度。
transform.Rotate(new Vector3(0, 0, 1), 10);
//new Vector3(0, 0, 1)表示声明一个旋转轴
// 旋转的速度也可以用浮点数来表示,如下:transform.Rotate(Vector3.up,30.0f,Space.Self);
2、通过在 Start() 方法前,声明公共变量(public)的方式。public方式的变量能在检视器中看到并修改,无需在脚本和编辑器中来回切换。
//只需要将以上的具体角度数值换成变量rotateAngle即可实现在inspector中进行修改
public class selfRotate : MonoBehaviour {
public int rotateAngle = 10;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
transform.Rotate(Vector3.up , rotateAngle);
}
}
//注意:游戏是在帧率(帧/秒)下运行的,帧率是取决于硬件和它运行压力,这样在性能好的机器上帧率快,
//而在性能差的机器上帧率慢,从而导致不可预知的结果。通常的办法是,当需要按每帧执行一个动作时,
//都乘上 Time.deltaTime。如下所示:
transform.Rotate(Vector3.up , 10*Time.deltaTime);
//或者
transform.Rotate(Vector3.up , rotateAngle*Time.deltaTime);
2、 Translate ———— 移动
(1)、将该脚本挂载到某一物体上,运行时效果如下图
public class ComponentDemo : MonoBehaviour
{
private void OnGUI()
{
if (GUILayout.Button("Translate01"))
{
//沿自身坐标系X轴平移0.8米
this.transform.Translate(0.8f, 0, 0);
}
if (GUILayout.Button("Translate02"))
{
//沿世界坐标系X轴平移0.8米
this.transform.Translate(0.8f, 0, 0, Space.World);
}
}
}
(2)、平移的其它用法总结:
平移与上面的旋转类似,只是使用的函数为:transform.Translate(g,h) 。其中的该函数具有二个参数:
g表示物体移动的速度,它是一个矢量,具有方向和大小;h表示在哪个坐标系下,缺省时指的是物体自身的坐标系Space.Self。
物体在世界坐标系下每帧沿着y轴正方向移动moveSpeed。速度的单位为:米/秒
//方法一:
public class selfRotate : MonoBehaviour {
public float moveSpeed = 1.0f;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
transform.Translate(Vector3.up * moveSpeed*Time.deltaTime,Space.World);
}
}
// 方法二:
public class selfRotate : MonoBehaviour {
public float moveSpeed = 1.0f;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
transform.Translate(new Vector3(0,1,0) * moveSpeed*Time.deltaTime,Space.World);
}
}
3、 RotateAround ———— 围绕旋转
public class ComponentDemo : MonoBehaviour
{
private void OnGUI()
{
if (GUILayout.RepeatButton("RotateAround")) //按住鼠标不动会连续的每帧运动一次
{
// 以世界坐标零点为中心,Y轴为旋转轴,旋转2度
this.transform.RotateAround(Vector3.zero, Vector3.up, 2);
}
}
}
4、其它常用功能
// 获取根物体
Transform rootTF = transform.root;
// 获取父物体
Transform parentTF = transform.parent;
// 设置父物体为theParent
transform.SetParent(theParent);
// 查找子物体(不能查找孙子),查找结果是变换组件
Transform childTF = transform.Find("NameOfTheChild");
// 查找子子物体
Transform chchildTF = transform.Find("NameOfTheChild/SonOfTheChild");
1、场景中(即:Hierarchy 面板中)的所有实体都是GameObject
2、属性及用法
// 在场景中物体的实际激活状态
bool gameState = gameObject.activeInHierarchy;
// 物体自身的激活状态(物体在Inspector面板中的状态)
bool selfState = gameObject.activeSelf;
// 设置物体禁用/启用
gameObject.SetActive(true);
// 通过代码创建一个物体
GameObject theGO = new GameObject();
// 添加光照的组件
Light light = theGO.AddComponent();
light.color = Color.red;
light.type = LightType.Point;
1、time:指从该帧开始到当前所用的时间,指游戏运行的时间
2、deltaTime:每帧消耗的时间。常用在Update函数中
void Update () {
// 每渲染帧执行一次,旋转一度
// 旋转速度*每帧消耗时间,可以保证旋转速度不受机器性能和渲染影响
transform.Rotate(0, 1*Time.deltaTime, 0);
}
注意:在 FixedUpdate() 函数中,速度就不需要乘以 Time.deltaTime ,因为其时间是固定的,与渲染无关。
3、timeScale:时间尺度,用来控制物体运动的暂停和停止。
注意:Update 函数渲染场景时执行,每渲染帧执行一次(注:渲染只是与硬件有关),不受 timeScale 的影响。但是当物体的速度乘以 Time.deltaTime 后,就会因为 Time.deltaTime 受到 timeScale 的约束,而使得 Update 函数也看起来是受 timeScale 的影响;FixedUpdate() 函数是固定时间执行一次(默认的是0.02s),其与渲染无关,会受到 timeScale 的影响。
(1)、点击暂停和开始来让物体停止/开始运动
public class TimeDemo : MonoBehaviour
{
private void FixedUpdate()
{
transform.Rotate(0, 100, 0);
}
private void OnGUI()
{
if (GUILayout.Button("Stop"))
{
Time.timeScale = 0;
}
if (GUILayout.Button("Start"))
{
Time.timeScale = 1;
}
}
}
以上代码在Unity中的效果如下图:
(2)、点击Stop之后部分物体停止运动,其他物体不受影响。此时要在Update函数中来进行操作:将速度乘以 unscaledDeltaTime ,即可让物体不受 timeScale 的影响
private void Update()
{
transform.Rotate(0, 100*Time.unscaledDeltaTime, 0);
}
private void OnGUI()
{
if (GUILayout.Button("Stop"))
{
Time.timeScale = 0;
}
if (GUILayout.Button("Start"))
{
Time.timeScale = 1;
}
}
【注】:实例—计时器:设置一个定时器倒计时2分钟,到最后10s钟的时候,用红色的字体来显示。具体流程、代码方法及效果如下:
(1)、创建Text,并将其名称修改的有意义。调整好文本显示的位置如下图
(2)两种代码实现的方法如下,若要使用 Text,则必须包含命名空间:UnityEngine.UI
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TimeDemo : MonoBehaviour
{
private Text textTimer;
private int nextTime=1; //指定的时间间隔
public int second = 120;
private void Start()
{
// 获取同一物体其它类型的组件(脚本)
textTimer = GetComponent();
//方法三的调用是在Start函数中使用重复调用来实现
InvokeRepeating("Timer03", 1, 1); //重复调用Timer03
}
private void Update()
{
Timer01(); //调用方法一
Timer02(); //调用方法二
}
//******************* 方法一 *********************************
private void Timer01()
{
//在Update每帧执行的方法中,个别语句实现指定间隔执行一次
if (Time.time >= nextTime && second > 0)
{
second--;
// 在字符串中插入变量,就用 string.Format,其返回一个字符串。d2是设置该变量的格式:用0来填充
textTimer.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);
if (second < 10)
{
textTimer.color = Color.red;
}
nextTime += 1;
}
}
//******************* 方法二 *********************************
private float totalTime=0;
void Timer02()
{
totalTime += Time.deltaTime;//累加每帧的间隔
if (totalTime >= 1 && second > 0) // 直到时间为1s
{
second--;
textTimer.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);
if (second < 10)
{
textTimer.color = Color.red;
}
totalTime = 0;
}
}
//******************* 方法三 *********************************
private void Timer03()
{
second--;
textTimer.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);
if (second < 10)
{
textTimer.color = Color.red;
}
if (second <= 0)
{
//取消调用
CancelInvoke("Timer03");
}
}
}