在Unity中,所有实体都属于游戏对象(GameObject),比如外部导入到场景中的模型,Unity自带的立方体等等,而要将这些GameOject进行管理,交互等操作,则需要用到脚本来实现,上一节我们已经学习了如何建立一个脚本并绑定到一个物体上,现在我们将进一步学习如何通过脚本对GameObject进行控制。

一、创建GameObject

在Unity里面,创建游戏对象有两种方式:

  1. 通过编辑器可视化添加,这一点我们在本系列博客的第三篇:【Unity3D游戏开发学习笔记】(三)移山倒海—Terrain的建造 中已经提到
  2. 第二种,则是通过脚本进行创建和删除,这种方式会相对灵活,接下来要讲的也正是这一种方式。

首先,我们新建一个脚本,暂时命名为:GameObjectControl好了,然后打开脚本,并进行以下编辑:

using UnityEngine;
using System.Collections;public class CreateObjects : MonoBehaviour {// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}void OnGUI(){if(GUILayout.Button("创建Cube",GUILayout.Height(50))){GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);cube.AddComponent<Rigidbody>();cube.GetComponent<Rigidbody>().useGravity = false;cube.GetComponent<Renderer>().material.color = Color.red;cube.name = "Cube";cube.transform.position = new Vector3(0.0f, 5.0f, 0.0f);}if (GUILayout.Button("创建Sphere", GUILayout.Height(50))){GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);sphere.AddComponent<Rigidbody>();sphere.GetComponent<Rigidbody>().useGravity = false;sphere.GetComponent<Renderer>().material.color = Color.green;sphere.name = "Sphere";sphere.transform.position = new Vector3(5.0f, 5.0f, 0.0f);}}
}

然后保存脚本,并绑定到Camera上,运行,我们就会发现在界面上多了两个按钮,然后分别点击之后,场景当中就会出现一个立方体和一个球体。

我们简要介绍一下几个主要用到的函数:

  1. GameObject.CreatePrimitive()创建一个GameObject对象并指定一个Unity自带的模型(如果想要生成别的物体可以使用GameObject.Instantiate(),这个我们后面说到)
  2. AddComponent< T>() 和 GetComponent< T>() 添加和获取GameObject的组件
  3. transform.position 设置物体在世界坐标系下的位置,如果是想要相对父节点的位置,则使用transform.localPosition

二、获取GameObject

通过脚本获取GameObject有两种方式:

  1. 通过声明一个Public变量,然后在Inspector视图进行赋值
  2. 通过GameObject的属性对象名称来获取
    public GameObject obj;//通过Inspector直接赋值// Use this for initializationvoid Start(){if (obj == null)obj = GameObject.Find("Cube");//根据名称直接在整个场景当中搜索该物体}

三、添加组件和修改组件

新建的GameObject一般情况下都是没有任何功能属性的,我们需要给它赋予各种游戏组件它才能有自己相应的游戏功能。比如我们拿刚刚那个例子来说:

cube.AddComponent<Rigidbody>();
cube.GetComponent<Rigidbody>().useGravity = false;
cube.GetComponent<Renderer>().material.color = Color.red;

我们这里给cube这个物体添加了一个叫Rigidbody的组件,这是一个刚体组件,有了这个组件,这个物体就受到物理引擎的作用,然后我们修改这个组件的useGravity属性,使它不受重力的作用,并把它材质属性中的颜色改成了红色。大家可以试一下改变它的重力属性,设为true,然后运行的时候我们就能看到立方体往下掉。总的来说,我们给游戏添加组件通过AddComponent< T>()的方法,获取组件则是通过GetComponent方法,然后如果是需要销毁组件,则使用Destroy(),该方法需要提供参数,如果参数是GameObject,就会将这个Object都销毁了。

四、发送广播和消息

在游戏当中,广播和消息是游戏对象之间通讯的一个快捷方式,就像广播那样,由发送方进行消息的发送,而Receiver游戏对象里的Monobehavior脚本都能收到。它主要是通过GameObject.SendMessage(string methonName, object value = null, SendMessageOptions options = SendMessageOptionsRequireReceiver)函数发送的。下面我们来看个例子。
我们新建一个脚本叫Receiver:

using UnityEngine;
using System.Collections;public class Receiver : MonoBehaviour {// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}void ShowNumber(int num){Debug.Log("我是: "+ this.transform.name + " 我收到的数字是 : " + num);}
}

然后我们将原来的GameObjectControl.cs文件改一下:

using UnityEngine;
using System.Collections;public class CreateObjects : MonoBehaviour {private GameObject[] receiver = new GameObject[2];// Use this for initializationvoid Start(){}// Update is called once per framevoid Update () {}void OnGUI(){if(GUILayout.Button("创建Cube",GUILayout.Height(50))){GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);receiver[0] = cube;cube.AddComponent<Receiver>();cube.AddComponent<Rigidbody>();cube.GetComponent<Rigidbody>().useGravity = false;cube.GetComponent<Renderer>().material.color = Color.red;cube.name = "Cube";cube.transform.position = new Vector3(0.0f, 5.0f, 0.0f);}if (GUILayout.Button("创建Sphere", GUILayout.Height(50))){GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);receiver[1] = sphere;sphere.AddComponent<Rigidbody>();sphere.AddComponent<Receiver>();sphere.GetComponent<Rigidbody>().useGravity = false;sphere.GetComponent<Renderer>().material.color = Color.green;sphere.name = "Sphere";sphere.transform.position = new Vector3(5.0f, 5.0f, 0.0f);}if (GUILayout.Button("发送消息", GUILayout.Height(50))){receiver[0].SendMessage("ShowNumber", 999, SendMessageOptions.RequireReceiver);receiver[1].SendMessage("ShowNumber", 222, SendMessageOptions.RequireReceiver);}}
}

在分别创建了立方体和球体之后,点击发送消息,我们可以看到以下结果:

Message相关有3条指令:
SendMessage (“函数名”,参数,SendMessageOptions) //GameObject自身的Script
BroadcastMessage (“函数名”,参数,SendMessageOptions) //自身和子Object的Script
SendMessageUpwards (“函数名”,参数,SendMessageOptions) //自身和父Object的Script

关于第三个参数使用:
SendMessageOptions.RequireReceiver //如果没有找到相应函数,会报错(默认是这个状态)
SendMessageOptions.DontRequireReceiver //即使没有找到相应函数,也不会报错,自动忽略

五、克隆游戏对象

克隆游戏对象跟创建游戏对象不一样,创建游戏对象,得出来的GameObject我们需要对他进行加载组件才能有自己的功能,而克隆游戏对象则可以克隆一个完全具有一定功能的游戏对象(包括其所有的组件)。通过克隆对象,我们可以节省很多的时间,比如子弹的发射,完全可以采用克隆的手段生成大量的子弹而不用我们自己手动新建并且添加属性。同样还是GameObjectControl这个例子,我们改动一下:
在OnGUI上新增一个函数

if (GUILayout.Button("CloneCube", GUILayout.Height(50)))
{GameObject obj = Instantiate(receiver[0]);obj.GetComponent<Rigidbody>().useGravity = true;obj.transform.position = new Vector3(0, 0, 0);
}

在分别点击创建立方体和球体之后,点击CloneCube的按键,我们可以看到每点一次就会生成一个红色的Cube出来并且往下落(因为我们设置了它的重力属性)

然后我们可以发现在Hierarchy界面上出现了很多的Cube(Clone)的Object。

六、移动、缩放,旋转

移动物体

要使游戏对象在原来的基础上继续移动,在代码中可以通过transform.Translate(Vector3 offset)实现,参数是移动的数值.

缩放物体

使用transform.localScale = new Vector3(x,y,z);
分别代表的是x轴方向上缩放x,y轴方向上缩放y,z轴方向上缩放z
整体缩放可以通过将localScale乘一个系数实现。

旋转物体

游戏对象的旋转方式有两种:

  1. 围绕自身旋转
  2. 围绕某一个点或者是某向量旋转

transform.Rotate()函数是自身的旋转,Unity里面提供了很多的实现方式
transform.RotateAround()则是围绕某个点旋转

这节就先到这O(∩_∩)O,下一节会介绍一些常用的工具类~

【Unity3D游戏开发学习笔记】(六)上帝之手—GameObject的操作相关推荐

  1. 【Unity3D游戏开发学习笔记】(一)Unity3D初认识

    一.什么是Unity3D Unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合 ...

  2. 【Unity3D游戏开发学习笔记】(七)上帝之眼—第三人称摄像机的简单实现(跟随视角,自由视角)

    陆陆续续又开始更新自己的博客,看来自我驱动能力还是不够啊= =,废话不多说了,之前的内容大概说了一下Unity的一些基础知识,接下来我们将要对一些基本功能做一些学习.大家都知道,一个游戏,少不了摄像机 ...

  3. 从一点儿不会开始——Unity3D游戏开发学习(一)

    一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...

  4. 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:// ...

  5. golang游戏开发学习笔记-开发一个简单的2D游戏(基础篇)

    此文写在golang游戏开发学习笔记-创建一个能自由探索的3D世界之后,感兴趣可以先去那篇文章了解一些基础知识,在这篇文章里我们要创建一个简单的2D游戏场景以及配套的人物,并实现人物运动和碰撞检测功能 ...

  6. 小狐狸横版游戏开发学习笔记(上)

    小狐狸横版游戏开发学习笔记(上) 目录 小狐狸横版游戏开发学习笔记(上) 1.关于如何创建Tilemap 2.关于地图格子之间出现间隙的问题 3.如何设置自己想要的控制按键 4.如何解决玩家移动过程中 ...

  7. 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第二十一课:Cocos2D-X网格特效1-3

    [麦可网]Cocos2d-X跨平台游戏开发---学习笔记 第二十一课:Cocos2D-X网格特效1-3 ================================================ ...

  8. golang游戏开发学习笔记-创建一个能自由探索的3D世界

    此文写在golang游戏开发学习笔记-用golang画一个随时间变化颜色的正方形之后,感兴趣可以先去那篇文章了解一些基础知识,在这篇文章里,我们将创建一个非常简单(只有三个方块)但能自由探索的的3D世 ...

  9. 游戏开发学习笔记——lua脚本语言——安装、汉化与小测试(解决lua运行代码乱码问题)

    游戏开发学习笔记--lua脚本语言--安装.汉化与小测试 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: Lua 是一种轻量小巧的脚本语言,用 ...

最新文章

  1. 服务器硬盘属于计算机哪一类,服务器和电脑虽然都是计算机,但却有很大区别,千万不要用错了...
  2. 对于下一代互联网的畅想
  3. 前端学习(2530):使用computed获取数据
  4. 一个关于 TensorFlow 的悲剧故事
  5. html增删改查按钮控件,HTML DOM节点的增删改查
  6. 用html语言写一个环形,html5环形流程图可添加流程图代码
  7. 记录一个看着比较顺眼的blockquote的css装饰
  8. Dapr for dotnet | 并发计算模型 - Virtual Actors
  9. Linux交换分区 swap分区
  10. Android 字体自适应屏幕的方法
  11. 随机数生成器Random类
  12. 毁掉一个年轻最好的办法,就是向他鼓吹财务自由
  13. Redis热点Key发现及常见解决方案总结
  14. 什么都会,也许只是盲目跟风,和优秀无关
  15. 电源开关电源200W 12V 24V,电源架构PFC+LLC+同步整流,高效率高功率因数
  16. 一位新竹科学园区朋友的来信
  17. 当效益不好的时候为什么公司选择裁员,而不是降薪
  18. 科大讯飞语音转文本(极速转换和普通转换两种)
  19. 【学习笔记】Hands On Machine Learning - Chap2. End-to-End Machine Learning Project
  20. Vissim11二次开发之C#---实现仿真时间内实施不同信号控制方案

热门文章

  1. DD-路径图、MM-路径图的定义与区别联系
  2. Linux 命令别名 alias(含“永久生效”方法)
  3. Squeeze-and-Excitation Networks论文翻译——中文版
  4. 处理回归问题常见的算法
  5. 分布式系统架构实例剖析
  6. jwt-auth官方文档
  7. Kubernetes的Pod详解
  8. [置顶] android关机闹钟设计思路
  9. 风口背后:第一批 00 后 Web3 创业者,和他们的「人间清醒」
  10. keras中的Convolution1D