c# unity3d

欢迎回来! 这是关于Unity 3D的三部分博客系列的第二部分。 在第一部分中,我们讨论了如何开始使用Unity 3D。 现在,继续前进,我们将讨论如何使用C#控制Unity 3D。

在对如何开始使用Unity 3D有了扎实的了解并刚刚创建了一个新项目之后,我们就离开了。

默认情况下,我们的新项目已创建了四个文件夹:Assets,Library,ProjectSettings和Temp。 Unity3D创建并设置其自身为我们现在正在使用的默认,未保存的主题。不要害怕:这篇文章看起来很长,但是有很多屏幕截图确保您可以轻松地进行学习。

现在到有趣的东西

首先,让我们添加一个飞机游戏对象作为我们的世界地板。 这可以通过几种不同的方式完成。

我们可以右键单击层次结构窗口并选择3D对象->平面,或者使用顶部工具栏并单击“游戏对象”->“ 3D对象”->“平面”。 这将添加一个游戏对象,该对象将具有一个10 x 10的网格平面,内部将绘制白色。 它还将具有一个网格碰撞器(默认情况下添加),它将在物理引擎以及我们添加到游戏对象的任何脚本中触发onCollision 。

Unity3D.2.1

设置场景

让我们添加一种材料,以将飞机的颜色更改为绿色,以获得更像草的感觉。 为此,我们需要创建可分配给飞机的材料资产。 在“资源”窗口中右键单击,然后单击“创建”->“材料”。 这将添加我们可以编辑的新材料。 我们将此材料命名为“草”。

Unity3D.2.2

现在我们有了草料,我们将其拖动并分配到飞机上。 单击并将材质拖到分层视图上,然后将其放在“平面”对象上。 这会将其添加到飞机上。 现在,在分层视图中单击平面对象,这将在检查器内部显示该平面对象。 现在,在检查器的底部,我们将看到草对象材料。

Unity3D.2.3

让我们编辑该材质,使其比灰色更鲜艳,更像草。

首先,我们将单击草料左侧的深灰色箭头,这将扩展草料并显示一堆可以更改的设置。

现在,让我们仅更改反照率颜色。 我们通过单击反照率旁边的色板来执行此操作,这将调出调色板供我们使用。 让我们输入红色34,绿色86,蓝色34,并将alpha保留为255。这将为我们提供一个很好的深绿色,用作草。

Unity3D.2.4

现在,我们应该可以看到适合草丛的绿色飞机。

Unity3D.2.5

现在编辑字段的大小。 我们可以再次选择飞机,在检查器中,您将在顶部看到一个名为“变换”的对象。 这是渲染器用作位置,旋转和缩放的基础的对象。 为了使我们能够调整静态平面对象的大小,我们可以缩放对象。 比例尺包含3个不同的值,每个值与一个尺寸XY Z有关。我们可以将这些方向统一地视为x表示宽度,y表示高度,z表示长度。 Unity使用Y向上坐标系,并且由于我们使用的是平面,因此宽度和长度只有二维X和Z。 让我们将两个值都设置为10,使我们的飞机比以前大10倍。 这应该给我们足够的移动空间。

Unity3D.2.6

现在,我们对场景进行了一些更改,让我们将场景保存到Assets文件夹中,以便我们可以重复使用而不会丢失当前的工作。 为此,请转到工具栏,然后单击“文件”->“保存场景”。 让我们以Assets中的名称“ Main Scene”保存场景。

Unity3D.2.7

将对象添加到场景中

现在,将一个对象添加到游戏世界中,使我们可以四处移动; 它将扮演我们的角色。 我们将使用多维数据集在游戏中表示这一点。 要添加多维数据集,请转到“层次结构”窗口,然后右键单击3D对象->多维数据集。

Unity3D.2.8

我们的场景应该看起来像这样,其中包含我们的立方体和平面。

Unity3D.2.9

注意我们的立方体在地面的一半。 这是因为立方体的原点或对象在其上进行变换的点位于中心。

我们可以通过沿其Y轴将对象向上移动0.5(这是1x1x1立方体的一半)来补偿此偏移。 我们可以通过从“层次结构”视图中选择多维数据集对象并在“检查器”中找到“变换”对象来进行更改。 我们将需要将对象的位置更改为x = 0,y = 0.5,z = 0。

Unity3D.2.10

Unity3D遵循嵌套对象或目标模型的原理。 这意味着,一切都是父项或子项,其根是“游戏对象”。 这使我们可以将诸如网格和材质之类的东西嵌套到一个对象中,该对象可以执行一个动作或完成一个变换。

最后,让我们第一次运行游戏世界。 编辑器顶部有三个按钮:“播放”,“暂停”和“步进”。 “播放”按钮将使用默认视图(场景窗口下方的游戏窗口)开始运行游戏。 游戏视图将显示在顶部。

Unity3D.2.11

按播放。 您应该看到的外观与之前的场景视图不同。 那是因为我们以前没有看过相机,而是看了“场景视图查找器”。

Unity3D.2.12

继续并取消选择播放。 编辑器将返回“场景视图”。

现在,让我们看一下“主摄像机”游戏对象。 为此,请在“层次结构视图”中选择“主摄像机”。 这是我们在Game Viewer(游戏查看器)或我们的主查看摄像机中使用的对象。 像所有其他对象一样,它嵌套在具有默认转换的游戏对象中。

Unity3D.2.13

我们可以将对象嵌套到“主摄像机”对象中,也可以将摄像机嵌套到其他对象中,所以让我们这样做。 通过在“层次结构”视图内右键单击(未选择任何内容)并选择“创建空白”来创建新的游戏对象。 这将在场景中添加一个空的游戏对象(带有转换),从某种意义上讲,我们可以将其用作“文件夹”。 我们将其命名为“玩家”。

Unity3D.2.14

现在,单击并拖动“ Main Camera和“ Cube游戏对象到“ Player对象上,这会将两个对象嵌套在“播放器”下。 现在,“ Main Camera和“ Cube对象是“ Player对象(父对象)的子级。 这将使我们能够对Player对象执行操作并影响两个孩子。 如果我们移动播放器对象,则立方体和主摄像机将随它们一起移动,而无需我们进行额外的移动。

Unity3D.2.15

最后深入探讨一些代码

让我们向我们的Player对象添加一个脚本以对其进行控制。 为此,请在“层次结构视图”中选择“播放器”对象,然后在检查器中单击“添加组件”。 在此处输入您要创建“ PlayerController”的脚本的名称,它将选择范围缩小到新脚本。 单击“新脚本”,这将弹出另一个菜单,询问脚本名称以及我们要选择的语言。

对于此示例,我们将使名称等于PlayerController并选择C#作为语言。 点击“创建并添加”。 然后,这将在您的Player对象上添加一个嵌套脚本对象,并在Asset View中创建脚本。

Unity3D.2.16

让我们打开脚本。 双击资产查看器中的脚本,这将打开Visual Studio或MonoDevelop。 对于此示例,我将使用MonoDevelop进行代码和调试。

Unity3D.2.17

在此脚本中,Unity3d首先为您实现了一些功能。 首先,它包含两个using语句,第一个是UnityEngine ,其中包括与Unity游戏引擎和Unity Editor进行交互的所有库。 下一个是System.Collections ,它提供对Mono System Collections库的访问。 然后,添加一个类PlayerController ,它是从MonoBehaviour类派生的脚本名称,该类是UnityEngine库的一部分。

它添加了两个默认功能: Start和Update 。 Start就像听起来一样,它是一个在构造对象后在应用程序启动时调用的函数。 每个基于Unity引擎主循环的Unity周期都会触发更新。

Unity3D.2.18

现在,让我们编写一些代码来使多维数据集执行某些操作,例如旋转。

首先,我们需要掌握要对其执行操作的对象。 由于我们要立方体旋转而不是相机旋转,因此我们不想仅旋转Player对象。 因此,让我们编写一些代码来获取多维数据集。 为此,请在我们的State函数上方添加public GameObject cube ; 这将在我们的类中为我们提供一个称为多维数据集的对象。

Unity3D.2.19

该对象已创建,但我们尚未将其指向任何对象。 让我们回到Unity编辑器,然后在Hierarchy View中选择Player对象。 现在在检查器中,我们现在看到嵌套脚本对象中有一个Cube对象(游戏对象)。

Unity3D.2.20

这将允许我们将Cube对象拖到我们的游戏对象上以进行控制。 现在,我们可以选择Player对象下面的Cube对象,并将其拖到Cube上。 或者,您可以单击对象旁边的圆圈,它将在场景/资产列表中为您提供要使用的对象列表。

Unity3D.2.21

现在,让我们回到我们的代码。 现在,在我们的代码中,我们可以编写将其旋转45度,以便它位于立方体的某个点上。 因此,在我们的Start函数中,编写以下代码:
cube.transform.Rotate( new Vector3(1,0,0), 45) 。 这段代码使用了我们的Cube对象,并作用于告诉它旋转的Transform对象。 第一个参数是vector3,它是3D空间中由三个维度表示的点:XYZ。在这里,我们说的是在第一个参数中,我们希望它仅作用于vector3的X维度。 我们要说的是,在第二个参数中,我们将X尺寸设置为45度,该角度应将其设置在边上。

让我们回到Unity编辑器并按Play:

Unity3D.2.22

现在要说清楚了吗? 我们可以添加另一个旋转,但这一次只设置Y尺寸
cube.transform.Rotate( new Vector3(0,1,0), 45) 。 再次让我们回到Unity编辑器并按Play。

Unity3D.2.23 Unity3D.2.24

糟糕,我们正在扎根。 这是因为我们只旋转了……而旋转时没有移动对象。 因此,因为原点仍然像以前一样位于中间,所以我们只有0.5的距离,这太近了。

为了解决这个问题,让我们写一些代码将对象再移动0.50个单位。 让我们将代码添加到最后一个旋转的正下方,然后添加cube.transform.position = new Vector3(0,0.5,0) 。 现在,让我们再次按“播放”以查看结果。

Unity3D.2.25 Unity3D.2.26

似乎变化不大。 这是因为设置位置时,我们没有添加位置。 我们将位置设置为一个新的Vector3,它刚好与之前的位置相同。 现在要解决此问题,我们可以将当前位置添加到我们要转换到的位置上。 让我们添加
+ cube.transform.position到我们要设置位置的第11行的末尾。 Cube.transform.position是我们立方体原点的当前位置vector3。 完成此操作后,让我们再次播放。

Unity3D.2.27 Unity3D.2.28

用箭头移动它

现在,我们对旋转和移动有了一些基础知识,让我们进行一个更像玩家的多维数据集事务,我们可以使用键盘上的箭头键来移动他。

首先,让我们删除编写的用于旋转和移动多维数据集位置的代码。 现在让我们移动相机,使其对世界更加友好。 让我们回到MonoDevelop并从开始删除我们的多维数据集代码。 我们还要在相机上添加一些动作。

现在我们可以像对多维数据集对象一样添加对camera对象的引用,但是Unity3D自动将其作为静态object Camera的一部分提供。 因此,让我们直接将位置变换写入该对象。 Camera.main.transform.position = new Vector3(0,5,-5); 。 与将当前位置添加到多维数据集不同,此处不需要这样做,因为我们想相对于玩家的绝对位置移动摄像机。 按播放。

Unity3D.2.29

Unity3D.2.30

现在我们不再看到立方体。 这是为什么? 好吧,我们没有轮换。 但是要测试并查看原因,让我们在保持“播放”模式的同时回顾一下“场景查看器”。

Unity3D.2.31

我们看到四个对象和一个摄像机预览。 相机预览是一个很棒的工具,可以让您(在选择相机的同时)看到游戏视图的静态视图。 我们还看到有一个摄像头,一个立方体,一个定向灯和绿色平面。 如果选择“摄像机视图”,则会看到箭头和四条白线。

这四条白线是相机看到的边界框。 您可以做的一个不错的技巧是在“层次视图”中,双击一个对象,然后在“场景视图”中将其居中。 这将使加载更容易找到。 您也可以上下滚动进行缩放。 如果在“场景视图”上按住鼠标右键并使用WSAD键,则可以根据需要在场景中飞行。

如果缩小并摆好姿势,以使照相机红色箭头指向您,您将看到边界框不再包围我们的立方体,因此我们将无法看到它。

Unity3D.2.33

为了解决这个问题,让我们写一些代码将相机旋转到大约35度,这样我们就可以鸟瞰。 在摄像机位置代码之后,让我们添加一个旋转:
Camera.main.transform.Rotate(new Vector3(1,0,0), 35); 。 这会将摄像机沿X轴向下旋转35度,将其指向我们的立方体。 现在让我们回到Unity Editor,然后再次按Play。

Unity3D.2.34

Unity3D.2.35

这还差不多。 现在我们可以看到我们的立方体,并且更像是鸟瞰游戏。 现在让我们回到箭头的方向。 像以前一样,我们希望在每次更新时都执行此操作,因此让我们向update函数中添加一些代码。 让我们首先编写代码以检测是否按下了前进(向上)箭头键。

if(Input.GetKey(KeyCode.UpArrow)){
	This.transform.position = this.transform.position + new Vector3(0,0,1) * Time.deltaTime;
}

Unity3D.2.36

现在,我们在按住向上箭头键的同时前进。 这是如何工作的,我们要设置this.transform位置,该位置是我们创建的父级游戏对象“ Player”的位置,我们当前位置,然后向前增加一个单位,然后乘以每个单位之间的时间帧。 我们可以通过更改相加的矢量来增加或减少它。

让我们在工作中添加更多对象以获得一个Ref,以便在我们四处走动时可以看到。 让我们回到编辑器,确保我们没有在玩。 一旦成立,然后转到未选择任何内容的“层次结构视图”,右键单击,添加另一个多维数据集和一个球体。 可能不会在世界原点添加对象,因此让我们选择在“层次结构视图”中添加的每个对象,并将转换设置回世界原点(0,0,0)。

Unity3D.2.38 Unity3D.2.37

现在,让我们使用编辑器而不是代码将刚添加的静态对象移到适当的位置。 我们将通过在“层次视图”中选择一个对象,然后在“场景视图”中拖动该对象来实现。 让我们将立方体放置在-5,3,9区域附近的某个位置,以便它在摄影机的视野中,而球体在2,2,2区域中。

Unity3D.2.39

Unity3D.2.41

让我们为Player Cube提供一种材料,以便我们可以看到哪个是我们的。 转到项目窗口,然后右键单击“创建材料”。 将该材质反照率设置为蓝色(0000FFFF),并将该材质拖动到Player对象内部的Cube中。

现在按播放。 出现游戏视图后,按键盘上的向上箭头。 现在,我们应该看到立方体前进。

图片29

向对象添加物理

现在让我们向这些对象中添加一些物理原理。 要添加物理,我们需要转到Unity3d编辑器并选择Sphere对象。 然后去检查员。 在检查器的底部,有一个“添加组件”按钮,单击该按钮,然后选择“物理”->“刚体”。 这会将对象添加到物理引擎。 让我们对白色多维数据集执行相同的过程,然后对父级Player游戏对象执行相同的过程。 然后,按播放。 现在我们应该看到球和立方体掉落,好像重力作用在它们上一样。

因此,为了使它看起来真的很有趣,让我们在播放器控制器上添加更多代码,使我们可以往回走。 在“资产”窗口中,双击我们的PlayerController脚本,这将使MonoDevelop备份并允许我们添加更多代码。

让我们添加几行新代码,以便当我们按向左或向右箭头键时, player对象将向左或向右旋转。

if(Input.GetKey(KeyCode.LeftArrow)){
	this.transform.RotateAround( new Vector3(0,0,0), Vector.up, -10 * Time.deltaTime);
}
if(Input.GetKey(KeyCode.RightArrow)){
	this.transform.RotateAround( new Vector3(0,0,0), Vector.up, 10 * Time.deltaTime);
}

Unity3D.2.43

让我们按Play,看看会发生什么。 这应该允许我们旋转并前后移动,但是一旦将立方体向前转动,它将不再朝着我们面对的方向。 为了解决这个问题,我们将需要更改为上面的动作编写的一些代码。

更改

This.transform.position = this.transform.position + new Vector3(0,0,1) * Time.deltaTime;

To
This.transform.position = this.transform.position + (this.transform.rotation * new Vector3(0,0,1)) * Time.deltaTime;

这会将旋转乘以方向,从而得到一个新的vector3,它将成为新的前进方向。

Unity3D.2.44

现在按播放。 我们应该能够前进并向左和向右转。 现在,您应该能够根据我们应用的刚体物理原理,进入球体和白色立方体将它们推开。

运动真的很慢。 让我们在代码中添加几个新的可编辑变量,这将使我们能够通过编辑器调整运动速度。 在public GameObject cube上方的代码中,我们添加两个新的float并将其public GameObject cube公开。 通过公开它们,它将在Unity编辑器中添加一个字段,以允许您通过检查器对其进行编辑。

public float forwardSpeed = 10.0f;
public float turningSpeed = 10.0f;

Unity3D.2.45

现在我们有了这些控件,让我们将这些字段添加到我们的运动代码中,以代替我们的硬编码值。

if(Input.GetKey(KeyCode.UpArrow)){
this.transform.position = this.transform.position + (this.transform.rotation * new Vector3(0,0,forwardSpeed)) * Time.deltaTime;
}
if(Input.GetKey(KeyCode.LeftArrow)){
	this.transform.RotateAround( new Vector3(0,0,0), Vector.up, turningSpeed * Time.deltaTime);
}
if(Input.GetKey(KeyCode.RightArrow)){
	this.transform.RotateAround( new Vector3(0,0,0), Vector.up, turningSpeed * Time.deltaTime);
}

Unity3D.2.46

现在,如果您没有注意到,转弯有些奇怪。 就像它在世界各地或在起点周围旋转一样。 这是因为我们使用了一个名为RotateAround的新函数,而不是之前使用的函数(即Rotate) 。 RotateAround函数的第一个参数设置旋转对象的位置。

我们放置了新的Vector3(0,0,0),它是世界中心/起点。 相反,让我们确定对象的原点,以便当我们转动相机时,它是通过对象的中心。 让我们将代码更改为如下所示:

if(Input.GetKey(KeyCode.LeftArrow)){
	this.transform.RotateAround( this.transform.position, Vector.up, turningSpeed * Time.deltaTime);
}
if(Input.GetKey(KeyCode.RightArrow)){
	this.transform.RotateAround( this.transform.position, Vector.up, turningSpeed * Time.deltaTime);
}

Unity3D.2.47

现在按播放,一切都应该正常了。

第二部分总结

oo! 现在,您应该对如何使用C#控制Unity3D有更好的了解。
请继续关注计划于下周发布的第三部分。 本系列的第三篇也是最后一篇文章将深入探讨如何使用Unity3D将这些更改实际变成一个简单的游戏。

翻译自: https://www.javacodegeeks.com/2016/08/controlling-unity3d-using-c-part-2.html

c# unity3d

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐