什么是游戏对象 (GameObjects)?
游戏中的每个对象都是一个游戏对象 (GameObject)。然而,游戏对象 (GameObjects) 本身不做任何事情。它们需要特殊属性 (special properties) 才能成为一个角色、一种环境或者一种特殊效果。但是每个对象要做很多不同的事情。如果每个对象都是一个游戏对象 (GameObject),我们该如何区分静态空间 (static room) 中的交互式启动对象 (interactive power-up object) 呢?是什么使得这些游戏对象 (GameObjects) 互不相同?
答案是游戏对象 (GameObjects) 是一种容器。它们是空盒,能够容纳组成一个光照贴图的岛屿或物理驱动的小车的不同部分。因此,要真正理解游戏对象 (GameObjects),就必须了解这些组成部分(称为“组件 (Components)”)。根据您要创建的对象类型,您可以添加不同的组件 (Components) 组合到游戏对象 (GameObject) 中。想象一个游戏对象 (GameObject) 是一口空烹饪锅,组件 (Components) 是不同的作料,它们构成了您的游戏食谱。您也可以使用脚本 (Scripts) 制作自己的组件 (Components)。
游戏蛮牛Unity用户文档
概括一下,GameObject像是一个盒子,在里面装了个必要的Transform组件,然后还可以装其它任意的组件,这些组件共同来完成GameObject的行为。游戏对象由它拥有的组件决定功能。
总结了一些目前遇到过/使用过的游戏对象操作,还有别的留待学习以后补充。
*目录(标题内容)参照【Unity3D游戏开发学习笔记】(六)上帝之手—GameObject的操作
一、创建GameObject
- 通过编辑器可视化添加
- 利用脚本(这里又可以涉及到克隆和预制,留到后面说)
普通的创建可以直接利用函数GameObject.CreatePrimitive()
二、获取GameObject
- 在Inspector进行赋值(需要把变量声明为Public
比如在太阳系代码中,通过把运行速度speed设置为public,即可手动输入赋值。
- 也可以利用函数,unity中提供了获取对象的五种方法
- 通过对象名称(Find方法)
- 通过标签获取单个游戏对象(FindWithTag方法)
- 通过标签获取多个游戏对象(FindGameObjectsWithTags方法)
- 通过类型获取单个游戏对象(FindObjectOfType方法)
- 通过类型获取多个游戏对象(FindObjectsOfType方法)
三、添加组件和修改组件
- 可以在Inspector中手动添加和删除,以及进行赋值、修改等操作。
- 利用函数【AddComponent<>()】添加组件、【GetComponent<\Rigidbody>().(属性值)=】赋值、修改属性
四、发送广播和消息
Message相关有3条指令:
SendMessage (“函数名”,参数,SendMessageOptions) //GameObject自身的Script
BroadcastMessage (“函数名”,参数,SendMessageOptions) //自身和子Object的Script
SendMessageUpwards (“函数名”,参数,SendMessageOptions) //自身和父Object的Script
一个例子:使用BroadcastMessage() 方法向子对象发送消息
//子对象
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Chair : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void SonMethod()
{
Debug.Log("Hello Father");
}
}
//父对象
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Table : MonoBehaviour {
// Use this for initialization
void Start () {
BroadcastMessage("SonMethod");
}
// Update is called once per frame
void Update () {
}
}
五、克隆和预设
- 克隆游戏对象可以“创建”一个完全具有一定功能的游戏对象(包括其所有的组件)
GameObject cloneGameObject= GameObject.Instantiate(template);
- 预设可以理解为一个类模版,使用预设可以方便快捷地创建大量相同属性的对象。首先可以利用编辑器可视化添加对象,然后在Resource文件夹中创建预设,如图:
//实例化预设
GameObject objPrefab = (GameObject)Resources.Load("Table");
Instantiate(objPrefab);
- 预设和克隆:对象克隆也是用来大批量创建对象的,但是这些对象之间并无关联,也不会因为被克隆的对象属性改变而影响克隆的对象。预设不同,修改预设会使得所有实例化的对象属性发生改变。
六、运动、缩放,旋转
- 游戏对象运动的本质是位移,也就是坐标的变换。一个对象的位置由(x,y,z)确定,当其中某个值改变,游戏对象就实现了运动。
有多种方法可以实现游戏对象的运动:
(1)直接修改物体的position
(2)transform.Translate(Vector3)
(3)transform.position += Vector3 - 缩放:
transform.localScale = Vector(x, y, z)表示x轴方向上缩放x,y轴方向上缩放y,z轴方向上缩放z ;也可以通过乘以系数达到整体缩放的效果 - 旋转:
transform.Rotate()函数是自身的旋转,比如太阳系代码中行星的自转;transform.RotateAround()则是围绕某个点旋转,比如太阳系代码中行星的公转
GameObject.Find("Sun").transform.Rotate(Vector3.up * Time.deltaTime * 10);
this.transform.RotateAround(origin.position, axis, speed * Time.deltaTime);
移动、缩放、旋转都可以在Inspector手动修改,需要注意的是position,如果是子对象,修改position是以它的父对象为origin,调整时要记住。
七、销毁游戏对象
- GameObject.Destroy
- Destroy(gameObject);
八、其他一些操作
- 激活或者关闭对象
- 修改对象标签
- ……
都是既可以利用脚本写代码,也可以直接在属性页进行修改的。