unity3d cube碰撞 3d中怎么实现穿透cube对象

【Unity3D游戏开发学习笔记】(六)上帝之手—GameObject的操作
在Unity中,所有实体都属于游戏对象(GameObject),比如外部导入到场景中的模型,Unity自带的立方体等等,而要将这些GameOject进行管理,交互等操作,则需要用到脚本来实现,上一节我们已经学习了如何建立一个脚本并绑定到一个物体上,现在我们将进一步学习如何通过脚本对GameObject进行控制。
一、创建GameObject
在Unity里面,创建游戏对象有两种方式:
通过编辑器可视化添加,这一点我们在本系列博客的第三篇: 中已经提到
第二种,则是通过脚本进行创建和删除,这种方式会相对灵活,接下来要讲的也正是这一种方式。
首先,我们新建一个脚本,暂时命名为:GameObjectControl好了,然后打开脚本,并进行以下编辑:
using UnityEngine
using System.Collections
public class CreateObjects : MonoBehaviour {
// Use this for initialization
void Start () {
// Update is called once per frame
void 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上,运行,我们就会发现在界面上多了两个按钮,然后分别点击之后,场景当中就会出现一个立方体和一个球体。
我们简要介绍一下几个主要用到的函数:
GameObject.CreatePrimitive()创建一个GameObject对象并指定一个Unity自带的模型(如果想要生成别的物体可以使用GameObject.Instantiate(),这个我们后面说到)
AddComponent& T&() 和 GetComponent& T&() 添加和获取GameObject的组件
transform.position 设置物体在世界坐标系下的位置,如果是想要相对父节点的位置,则使用transform.localPosition
二、获取GameObject
通过脚本获取GameObject有两种方式:
通过声明一个Public变量,然后在Inspector视图进行赋值
通过GameObject的属性对象名称来获取
public GameO
void 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 UnityE
using System.C
public class Receiver : MonoBehaviour {
void Start () {
void 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 initialization
void Start()
// Update is called once per frame
void 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乘一个系数实现。
游戏对象的旋转方式有两种:
围绕自身旋转
围绕某一个点或者是某向量旋转
transform.Rotate()函数是自身的旋转,Unity里面提供了很多的实现方式
transform.RotateAround()则是围绕某个点旋转
这节就先到这O(∩_∩)O,下一节会介绍一些常用的工具类~
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?unity 改变cube颜色
发光的物体总是能给人很好的视觉体验,在unity中,尤其是场景比较大.物体比较多的时候,一些着重表现的物体需要增加发光效果.或者,当我们点击.Hover时物体发光,以便和未触发物体相互区别.下面介绍两种使物体发光的方法
分类: 标签:效果, 物体
1:获得诸如Plane.Cube的size. 1):可以为它们添加Collider,然后使用XXX.collider.bounds.该方法获得的size和缩放比例有关,是一一对应的,缩放比例一旦改变,size也 ...
分类: 标签:尺寸, 开发者, 物体
一.创建Unity项目 打开Unity游戏编辑器界面,在导航菜单栏中选择File ---& New Project菜单项,在弹出界面中选择Create new Project页面,将项目名命名为MobilityMo ...
分类: 标签:项目, 模型
Unity3d中对对象的操作绝大部分是基于对象的一个坐标系来进行操作的,现在我就全面的去详细的分享 工具/原料 Untiy3d和其内置的编译器 方法/步骤 创建两个系统的对象作为根节点,并设置其初始的Transform属 ...
分类: 标签:对象, 坐标系, 初探
近2年来游戏行业使用范围比较大的引擎,普及度较高的游戏引擎可能是Unity3D了.同时因为Unity的强大,也给很多小的工作室或团队有了较好的表现机会.但是程序员想独自开发出自己的游戏难度应当不是在程序方面,而是在图片资 ...
分类: 标签:资源, 场景
parent是Transform对象的一个成员变量,SetParent是Transform对象的一个方法两者有一个共同的作用就是将一个对象变成另外一个对象的子节点对象 工具/原料 Unity3d及器编译器 方法/步骤 创 ...
分类: 标签:对象, 实质
这篇经验是写给初次使用unity3D游戏引擎,不知道如何操作的新手.这里只是粗略地介绍了主要的按键功能和操作,以unity3D5.0版本为例,不涉及游戏脚本的编写,下次会详细地介绍脚本的编写. 工具/原料 unity3D ...
分类: 标签:脚本, 引擎
Animation制作过程中经常会遇到一些异常,本文就两种典型异常做出介绍并给出解决方案,以减少因异常导致的重复工作 工具/原料 unity 方法/步骤 场景搭建:新建一个空的GameObject,创建三个子物体,分别是 ...
分类: 标签:物体
Unity3d中要对对象进行操作必须首先去获取得到场景中的对象,那么弄清除获取对象的小细节就能够事半功倍 工具/原料 Unity3d和其内置的编译器 方法/步骤 在层级面板中选择多个对象相同的部分在监听器面板中给显示出来 ...
分类: 标签:细节, 对象
gameObject是获取当前挂载的一个对象,GameObject是Untiy3d所有对象的一个基类,transform是获取当前挂载的对象的transform,Transform是一个类 工具/原料 Unity3d和自 ...
分类: 标签:对象, 基类
unity3d利用lighmapping(光照贴图技术)来烘培物体,这种技术是一种增强场景光照效果的技术,它可以通过较低的性能来使得场景看上去更加真实.丰富,以及更加有立体感.下面简单介绍一下如何烘培物体. 工具/原料
分类: 标签:场景, 物体
实现一个正方体,沿着正方形的路线移动 工具/原料 unity 方法/步骤 将要实现一个正方体,沿着正方形的路线移动.打开一个空的工程,新建一个Cube,给这个Cube添加组件Animation,然后用快捷键Ctrl+6打 ...
分类: 标签:速度, 动画, 倒序
使用unity3d API中的Camera.RenderToCubemap渲染到立方图. 工具/原料 unity3d游戏引擎 RenderCubemapWizard脚本 方法/步骤 --------------新建一个& ...
分类: 标签:世界, 场景
有Translate方法的平移和没有Translate的平移(Transform的position) ,有rotation和有Rotate的深入的探讨 工具/原料 Unity3d和自带的编译器 对象的平移 创建一个空的对 ...
分类: 标签:对象
工具/原料 Unity3d和自带的编译器 创建一个系统的Cube对象命名为OriginObjec并且在层级面板显示 操作对象的Transform# 操作对象的Transform# 在对象绑定的对象上的C#中去操作Tran ...
分类: 标签:动态, 对象
工程中常常会用到两个或多个Camera,此时就会出现如何在恰当的时候显示恰当的摄像机内容和如何设置每个摄像机能够看到的内容两个问题.下面我们将依次解答 工具/原料 unity开发环境 方法/步骤 首先搭建Unity环境( ...
分类: 标签:问题, 内容, 常识, 场景
日前,网络游戏行业正以肉眼可见的速度发展,行业受众,也就是玩家也随着行业的发展变得愈来愈挑剔.从画面到音乐音效,从玩法到社会系统,玩家都能从中挑出这样那样的瑕疵.也因此,使得端游市场逐步萎缩,每个月都会有不少端游测试,但 ...
分类: 标签:教程, 广州, 官方, 材质
前段时间,整理了下unity 3D中 iTween 插件的使用,与大家分享下. iTween是一个动画库,作者创建它的目的就是最小的投入实现最大的产出.让你做开发更轻松,用它可以轻松实现各种动画,晃动,旋转,移动,褪色, ...
分类: 标签:大小, 对象, 物体
粒子系统添加完后,就需要介绍一下粒子系统的控制面板了,这里的面板控制场景中粒子的表现行为,通过仔细的调解可以创建出丰富多彩的粒子效果,可以模拟雨的效果,瀑布的效果,当然还有各种酷炫的技能特效. 工具/原料 unity3d ...
分类: 标签:控制面板, 粒子, 粒子系统
这里并不比较Unity3D自带的List类与NGUI提供的BetterList类性能上的优劣,从NGUI给出的名字来看,至少在NGUI的所有应用中,灵活使用BetterList类的确能得到更Better的效果.本文以实例 ...
分类: 标签:数据, 按钮
黔ICP备号-1Unity3d(5)
#pragma strict
private var m_pCubeObj : GameObject =
private var m_pMeshFilter : MeshFilter =
public var m_fTramslateSpeed : float = 20.0f;
public var m_fRotateSpeed : float = 60.0f;
function OnGUI(){
GUI.Label(new Rect(0.0f,0.0f,Screen.width,20.0f),&this is my first GUI&);
if(GUI.Button(new Rect(5.0f,30.0,100.0f,40.0f),&Click me&))
m_pCubeObj = GameObject.CreatePrimitive(PrimitiveType.Cube);//创建一个Cube
if(null != m_pCubeObj)
m_pCubeObj.transform.position = new Vector3(1.0f,2.0f,0.0f);
if(GUI.Button(new Rect(5.0f,170.0f,100.0f,40.0f),&向前移动&))
m_pCubeObj.transform.Translate(Vector3.forward * Time.deltaTime * m_fTramslateSpeed);
if(GUI.Button(new Rect(115.0f,170.0f,100.0f,40.0f),&向后移动&))
m_pCubeObj.transform.Translate(Vector3.forward * Time.deltaTime * -m_fTramslateSpeed);
if(GUI.Button(new Rect(225.0f,170.0f,100.0f,40.0f),&向左移动&))
m_pCubeObj.transform.Translate(Vector3.left * Time.deltaTime * m_fTramslateSpeed);
if(GUI.Button(new Rect(335.0f,170.0f,100.0f,40.0f),&向右移动&))
m_pCubeObj.transform.Translate(Vector3.left * Time.deltaTime * -m_fTramslateSpeed);//Vector.right
if(GUI.Button(new Rect(5.0f,220.0f,100.0f,40.0f),&向左旋转&))
m_pCubeObj.transform.Rotate(Vector3.up * Time.deltaTime * -m_fRotateSpeed);
if(GUI.Button(new Rect(115.0f,220.0f,100.0f,40.0f),&向右旋转&))
m_pCubeObj.transform.Rotate(Vector3.up * Time.deltaTime * m_fRotateSpeed);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:11261次
排名:千里之外
原创:15篇
(1)(8)(10)

我要回帖

更多关于 unity3d cube碰撞 的文章

 

随机推荐