如何从另一个bat 脚本 变量通过GetComponent访问变量在另一个游戏物体

一、脚本概览;这是一个关于Unity内部脚本如何工作的简单概览;Unity内部的脚本,是通过附加自定义脚本对象到;Update:;这个函数在渲染一帧之前被调用,这里是大部分游戏行;这个函数在每个物理时间步被调用一次,这是处理基于;在任何函数之外的代码:;在任何函数之外的代码在物体被加载的时候运行,这个;注意:文档的这个部份假设你是用Javascrip;你也能
一、 脚本概览
这是一个关于Unity内部脚本如何工作的简单概览。
Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的。在脚本对象内部不同志的函数被特定的事件调用。最常用的列在下面:
这个函数在渲染一帧之前被调用,这里是大部分游戏行为代码被执行的地方,除了物理代码。 FixedUpdate:
这个函数在每个物理时间步被调用一次,这是处理基于物理游戏的地方。
在任何函数之外的代码:
在任何函数之外的代码在物体被加载的时候运行,这个可以用来初始化脚本状态。
注意:文档的这个部份假设你是用Javascript,参考用C#编写获取如何使用C#和Boo编写脚本的信息。
你也能定义事件句柄,它们的名称都以On开始,(例如OnCollisionEnter),为了查看完整的预定义事件的列表,参考MonoBehaviour 文档。
概览:常用操作
大多数游戏物体的操作是通过游戏物体的Transform或Rigidbody来做的,在行为脚本内部它们可以分别通过transform和rigidbody访问,因此如果你想绕着Y轴每帧旋转5度,你可以如下写:
function Update(){
transform.Rotate(0,5,0);
如果你想向前移动一个物体,你应该如下写:
function Update(){
transform.Translate(0,0,2);
概览:跟踪时间
Time类包含了一个非常重要的类变量,称为deltaTime,这个变量包含从上一次调用Update或FixedUpdate(根据你是在Update函数还是在FixedUpdate函数中)到现在的时间量。 所以对于上面的例子,修改它使这个物体以一个恒定的速度旋转而不依赖于帧率: function Update(){
transform.Rotate(0,5*Time.deltaTime,0);
移动物体:
function Update(){
transform. Translate (0, ,0,2*Time.deltaTime);
如果你加或是减一个每帧改变的值,你应该将它与Time.deltaTime相乘。当你乘以Time.deltaTime时,你实际的表达:我想以10米/秒移动这个物体不是10米/帧。这不仅仅是因为你的游戏将独立于帧而运行,同时也是因为运动的单位容易理解。( 米/秒)
另一个例子,如果你想随着时间增加光照的范围。下面的表达式,以2单位/秒改变半
function Update (){
light.range += 2.0 * Time.deltaT
当通过力处理刚体的时候,你通常不必用Time.deltaTime,因为引擎已经为你考虑到了这一点。
概览:访问其他组件
组件被附加到游戏物体,附加Renderer到游戏物体使它在场景中渲染,附加一个Camera使它变为相机物体,所有的脚本都是组件,因为它们能被附加到游戏物体。
最常用的组件可以作为简单成员变量访问:
可如下访问
camera (only on camera objects)
light (only on light objects)
对于完整的预定义成员变量的列表。查看Component,Behaviour和MonnoBehaviour类文档。如果游戏物体没有你想取的相同类型的组件,上面的变量将被设置为null。
任何附加到一个游戏物体的组件或脚本都可以通过GetComponent访问。
transform.Translate(0,3,0);
GetComponent(Transform).Translate(0, 1, 0);
注意transfom和Transform之间大小写的区别,前者是变量(小写),后者是类或脚本名称(大写)。大小写不同使你能够从类和脚本名中区分变量。
应用我们所学,你可以使用GetComponent找到任何附加在同一游戏物体上的脚本和组件,请注意要使用下面的例子能够工作,你需要有一个名为OtherScript的脚本,其中包含一个DoSomething函数。OtherScript脚本必须与下面的脚本附加到相同的物体上。
//这个在同一游戏物体桑找到名为OtherScript的脚本
//并调用它上加的DoSomething
function Update(){
otherScript = GetComponent(OtherScript);
otherScript.DoSomething();
概览:访问其它游戏物体
大多数高级的代码不仅需要操作一个物体,Unity脚本接口有各种方法来找到并访问其他游戏物体和组件。在下面,我们假定有个一名为OtherScript,js的脚本附加到场景的游戏物体上。
var foo = 5;
function DoSomething ( param : String) {
print(param + & with foo: & + foo);
1.通过检视面板赋值引用
你可以通过检视面板赋值变量到任何物体
//变换拖动到target的物体
var target : T
function Update ()
target.Translate(0, 1, 0);
你也可以在检视面板中公开到其他物体的引用,下面你可以拖动一个包含的游戏物体到检视面板中的target槽。
//设置在检视面板中赋值的target变量上的foo,调用DoSomething
var target : OtherS
function Update ()
//设置target物体的foo变量
target.foo = 2;
// 调用target上的DoSomething
target.DoSomething(&Hello&);
2.通过物体层次定位
对于一个已经存在的物体,可以通过游戏物体的Transform组件来找到子和父物体; //找到脚本所附加的
//游戏物体的子“Hand”
transform.Find(&Hand&).Translate(0, 1, 0);
一旦在层次视图中找到这个变换,你可以使用GetComponent来获取其他脚本,
//找到名为“Hand”的子
//在附加到它上面的OtherScript中,设置foo为2;
transform.Find(&Hand&).Translate(0, 1, 0);
//找到名为“Hand”的子
//然后应用一个力到附加在hand上的刚体
transform.Find(&Hand&).GetComponent(OtherScript).DoSomething(&Hello&);
// 找到名为“Hand”的了
// 然后应用一个力到附加在hand上的刚体
transform.Find(&Hand&).rigidbody.AddForce(0, 10, 0);
你可以循环所有的子,
//变换的所有子向上移动10个单位
for (var child : Transform in transform)
child.Translate(0, 1, 0);
参考Transform类文档获取更多信息。
3.根据名称或标签定位.
你可以使用GameObject.FindWithTag和GameObject.FindGameObjectsWithTag搜索具有特定标签的游戏物体,使用GameObject.Find根据名称查找物体。
function Start ()
// 按照名称
var go = GameObject.Find(&SomeGuy&);
go.transform.Translate(0, 1, 0);
// 按照标签
var player = GameObject.FindWithTag(&Player&);
player.transform.Translate(0, 1, 0);
你可以在结果上使用GetComponent,在找到的游戏物体上得到任何脚本或组件。 function Start ()
var go = GameObject.Find(&SomeGuy&);
go.GetComponent(OtherScript).DoSomething();
var player = GameObject.FindWithTag(&Player&);
player.GetComponent(OtherScript).DoSomething();
一些特殊的物体有快捷方式,如主相机使用Camera.main。
4.作为参数传递
一些事件消息在事件包含详细信息。例如,触发器事件传递碰撞物体的Collider组件到处理函数。
OnTriggerStay给我们一个到碰撞器的引用。从这个碰撞器我们可以获取附加到其上的刚体。 function OnTriggerStay( other : Collider ) {
// 如果另一个碰撞器也有一个刚体
// 应用一个力到它上面
if (other.rigidbody) {
other.rigidbody.AddForce(0, 2, 0);
或者我们可以通过碰撞器获取附加在同一个物体上的任何组件。
function OnTriggerStay( other : Collider ) {
// 如果另一个碰撞器附加了OtherScript
// 调用它上面的DoSomething
// 大多数时候碰撞器不会附加脚本
// 所以我们需要首先检查以避免null引用异常
if (other.GetComponent(OtherScript)) {
other.GetComponent(OtherScript).DoSomething();
注意通过上述例子中的other变量,你可以访问碰撞物体中的任何组件。
5.一种类型的所有脚本
使用Object.FindObjectsOfType找到所有具有相同类或脚本名称的物体,或者使用Object.FindObjectOfType.找到这个类型的第一个物体。
function Start ()
// 找到场景中附加了OtherScript的任意一个游戏物体
var other : OtherScript = FindObjectOfType(OtherScript);
other.DoSomething();
概览:向量
Unity使用Vector3类同一表示全体3D向量,3D向量的不同组件可以通过想x,y和z成员变量访问。
var aPosition : Vector3;
aPosition.x = 1;
aPosition.y = 1;
aPosition.z = 1;
你也能够使用Vector3构造函数来同时初始化所有组件。
var aPosition = Vector3(1, 1, 1);
Vector3也定义了一些常用的变量值。
var direction = Vector3. // 与 Vector3(0, 1, 0);相同
单个向量上的操作可以使用下面的方式访问:
someVector.Normalize();
使用多个向量的操作可以使用Vector3类的数;
theDistance = Vector3.Distance(oneVector, otherVector);
(注意你必须在函数名之前写Vector3来告诉JavaScript在哪里找到这个函数,这适用于所有类函数)
你也可以使用普通数学操作来操纵向量。
combined = vector1 + vector2;
查看Vector3类文档获取完整操纵和可用属性的列表。
概览:成员变量 & 全局变量变量
定义在任何函数之外的变量是一个成员变量。在Unity中这个变量可以通过检视面板来访问,任何保存在成员变量中的值也可以自动随工程保存。
var memberVariable = 0.0;
上面的变量将在检视面板中显示为名为&Member Variable&的数值属性。
如果你设置变量的类型为一个组件类型(例如Transform, Rigidbody, Collider,任何脚本名称,等等)然后你可以在检视面板中通过拖动一个游戏物体来设置它们。
var enemy : T
function Update()
if ( Vector3.Distance( enemy.position, transform.position ) & 10 );
print(&I sense the enemy is near!&);
你也可以创建私有成员变量。私有成员变量可以用来存储那些在该脚本之外不可见的状态。私有成员变量不会被保存到磁盘并且在检视面板中不能编辑。当它被设置为调试模式时,它们在检视面板中可见。这允许你就像一个实时更新的调试器一样使用私有变量。 private var lastCollider : C
三亿文库包含各类专业文献、外语学习资料、应用写作文书、高等教育、幼儿教育、小学教育、文学作品欣赏、中学教育、专业论文、37Unity3D中文脚本使用手册等内容。 
 Unity3D中文脚本使用手册_IT/计算机_专业资料。包含unity所有脚本 一、 脚本概览 这是一个关于 Unity 内部脚本如何工作的简单概览。 Unity 内部的脚本,是通过附加自...  Unity3D+脚本+中文+参考_计算机软件及应用_IT/计算机_专业资料。对Unity3D的全...Unity3D中文脚本使用手册... 454页 1下载券
Unity3D中文脚本使用手册... ...  Unity3D中文菜单手册_IT/计算机_专业资料。Unity3D中文菜单手册Unity3D 命令手册 ...外部脚本编辑器 ===Use built-in editor(UniSciTE) 使用内置的编辑器(UniSciTE...  中文Unity3D脚本参考[1]_计算机软件及应用_IT/计算机...大多数高级的代码不仅需要操作一个物体,Unity 脚本...这是一个基本的例子,说明可以使用一个数组类做什么...  我学院:Unity3D使用C#编程脚本基础_计算机软件及应用_IT/计算机_专业资料。我学院:Unity3D使用C#编程脚本基础Unity3D 使用 C#编程脚本基础 Unity3D 提供了三种可供...  我学院:Unity3D命令使用手册_计算机软件及应用_IT/计算机_专业资料。我学院:...参考手册 Scripting Manual 脚本手册 Unity Forum Unity Welcome Screen Release ...  Unity中文手册_计算机软件及应用_IT/计算机_专业资料。Unity学习入门[...Unity软件使用说明 3页 免费 喜欢此文档的还喜欢 中文Unity3D脚本参考 454页 免费...  Unity3D入门中文版_计算机软件及应用_IT/计算机_专业...左边的第一个 View Tool将在以后说明。后面的工具...如果你想加载一个 新的场景,在你的脚本中使用 ...你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
怎么用代码去获取 gameobject 身上的某个脚本的某个变量
.GetComponent().变量名或方法名
首先.变量和方法必须是公共变量.方法
首先你要能找到这个GameObject,那么就用如GameObject.FindGameObjectsWithTag(“标记的Tag”)的方式,该方法返回找到的游戏物体,或者NULL
然后针对这个游戏物体进行脚本的获取。脚本或者其他东西都是以“组件”的形式对待的,所以用“获取组件”的方法:GetComponent;
比如说我有一个FatherController的脚本挂在在一个物体上,那么使用:
GameObject g = GameObject.FindGameObjectsWithTag( "Player" );//获取脚本
g.GetComponent( ).m_hp=90;//针对获取到的脚本进行血量操作。
这里m_hp在脚本里是public int m_hp;
gameobject.GetComponent()
要回复问题请先或
浏览: 2061
关注: 4 人// 按照名称
var go = GameObject.Find("SomeGuy");
go.transform.Translate(0, 1, 0);
// 按照标签
var player = GameObject.FindWithTag("Player");
player.transform.Translate(0, 1, 0);
你可以在结果上使用GetComponent,在找到的游戏物体上得到任何脚本或组件。 function Start ()
var go = GameObject.Find("SomeGuy");
go.GetComponent(OtherScript).DoSomething();
var player = GameObject.FindWithTag("Player");
player.GetComponent(OtherScript).DoSomething();
一些特殊的物体有快捷方式,如主相机使用Camera.main。
4.作为参数传递
一些事件消息在事件包含详细信息。例如,触发器事件传递碰撞物体的Collider组件到处理函数。
OnTriggerStay给我们一个到碰撞器的引用。从这个碰撞器我们可以获取附加到其上的刚体。
function OnTriggerStay( other : Collider ) {
// 如果另一个碰撞器也有一个刚体
// 应用一个力到它上面
if (other.rigidbody) {
other.rigidbody.AddForce(0, 2, 0);
或者我们可以通过碰撞器获取附加在同一个物体上的任何组件。
function OnTriggerStay( other : Collider ) {
// 如果另一个碰撞器附加了OtherScript
// 调用它上面的DoSomething
// 大多数时候碰撞器不会附加脚本
// 所以我们需要首先检查以避免null引用异常
if (other.GetComponent(OtherScript)) {
other.GetComponent(OtherScript).DoSomething();
注意通过上述例子中的other变量,你可以访问碰撞物体中的任何组件。
5.一种类型的所有脚本
使用Object.FindObjectsOfType找到所有具有相同类或脚本名称的物体,或者使用Object.FindObjectOfType.找到这个类型的第一个物体。
function Start ()
// 找到场景中附加了OtherScript的任意一个游戏物体
var other : OtherScript = FindObjectOfType(OtherScript);
other.DoSomething();
概览:向量
Unity使用Vector3类同一表示全体3D向量,3D向量的不同组件可以通过想x,y和z成员变量访问。
var aPosition : Vector3;
aPosition.x = 1;
aPosition.y = 1;
aPosition.z = 1;
你也能够使用Vector3构造函数来同时初始化所有组件。
var aPosition = Vector3(1, 1, 1);
Vector3也定义了一些常用的变量值。
var direction = Vector3. // 与 Vector3(0, 1, 0);相同
单个向量上的操作可以使用下面的方式访问:
someVector.Normalize();
使用多个向量的操作可以使用Vector3类的数;
theDistance = Vector3.Distance(oneVector, otherVector);
(注意你必须在函数名之前写Vector3来告诉JavaScript在哪里找到这个函数,这适用于所有类函数)
你也可以使用普通数学操作来操纵向量。
combined = vector1 + vector2;
查看Vector3类文档获取完整操纵和可用属性的列表。
概览:成员变量 & 全局变量变量
定义在任何函数之外的变量是一个成员变量。在Unity中这个变量可以通过检视面板来访问,任何保存在成员变量中的值也可以自动随工程保存。
var memberVariable = 0.0;
上面的变量将在检视面板中显示为名为"Member Variable"的数值属性。
如果你设置变量的类型为一个组件类型(例如Transform, Rigidbody, Collider,任何脚本名称,等等)然后你可以在检视面板中通过拖动一个游戏物体来设置它们。
var enemy : T
function Update()
if ( Vector3.Distance( enemy.position, transform.position ) & 10 );
print("I sense the enemy is near!");
你也可以创建私有成员变量。私有成员变量可以用来存储那些在该脚本之外不可见的
状态。私有成员变量不会被保存到磁盘并且在检视面板中不能编辑。当它被设置为调试模式时,它们在检视面板中可见。这允许你就像一个实时更新的调试器一样使用私有变量。
private var lastCollider : C
function OnCollisionEnter( collisionInfo : Collision ) {
lastCollider = collisionInfo.
你也可以使用static关键字创建全局变量
这创造了一个全局变量,名为someGlobal
// TheScriptName.js中的一个静态变量
static var someGlobal = 5;
// 你可以在脚本内部像普通变量一样访问它
print(someGlobal);
someGlobal = 1;
为了从另一个脚本访问它,你需要使用这个脚本的名称加上一个点和全局变量名。 print(TheScriptName.someGlobal);
TheScriptName.someGlobal = 10;
概览:实例化
实例化,复制一个物体。包含所有附加的脚本和整个层次。它以你期望的方式保持引用。到外部物体引用的克隆层次将保持完好,在克隆层次上到物体的引用映射到克隆物体。
实例化是难以置信的快和非常有用的。因为最大化地使用它是必要的。
例如, 这里是一个小的脚本,当附加到一个带有碰撞器的刚体上时将销毁它自己并实例化一个爆炸物体。
var explosion : T
// 当碰撞发生时销毁我们自己
// 并生成给一个爆炸预设
function OnCollisionEnter (){
Destroy (gameObject);
theClonedExplosion : T
theClonedExplosion = Instantiate(explosion, transform.position, transform.rotation);
实例化通常与预设一起使用
概览:Coroutines & Yield
在编写游戏代码的时候,常常需要处理一系列事件。这可能导致像下面的代码。
private var state = 0;
function Update()
if (state == 0) {
// 做步骤0
state = 1;
if (state == 1) {
// 做步骤1
看过本文章的还看过。。。
unity3d经典入门教程(精)_计算机软件及应用_it计算机_专业资料。绝对有用的教程,初学者转变为大牛的教程!!!一、unity基础本部分是你开始unity的关键。、这里将.........
unity3d基础入门视频教程全集汇总_互联网_it计算机_专业资料。unity3d基础入门视频教程全集汇总 奇酷学院 unity3d 培训入门基础教程汇总 unity 编辑器简介-inspector .........
[转载]unity3d游戏引擎最详尽基础教程_计算机软件及应用_it计算机_专业资料。[转载]unity3d 游戏引擎最详尽基础教程原文地址:unity3d 游戏引擎最详尽基础教程作者:.........
unity3d入门教程中文版_it计算机_专业资料。unity3d入门的简单教程完整版,而且是中文版的 unity3d 基本操作、 用 unity3d 创建简单漫游 ... 1 基本设置.........
哪里有免费的 unity3d 教程作为一名 unity3d 从业者, 我很负责的告诉你, ...而现在的移动互联开发这么 火,学习 unity3d 后想找到一份好工作也是比较简单的.........
unity3d经典入门教程(精)_计算机软件及应用_it计算机_专业资料。一、unity基础本部分是你开始unity的关键。、这里将解释unity的界面,菜单项,使用资源,创建场 景,.........
unity3d脚本入门_互联网_it计算机_专业资料
暂无评价|0人阅读|0次下载|举报文档unity3d脚本入门_互联网_it计算机_专业资料。unity3d脚本编程入门级教程 .........
unity3d游戏开发菜鸟快速上手指南_互联网_it计算机_专业资料。本文适合没有接触过unity3d和手游开发,并想了解其大概的同学。大家对 unity3d 游戏引擎应该并不陌生.........
多个物体使用同一贴图的烘培光影处理 因为我们在导入 fbx 文件到 unity3d 编辑器中的时候,使用的都是按贴图来生成材质文 件,所以多个物体使用同一贴图时会发生.........
unity 3d 图解经典入门教程_其它语言学习_外语学习_教育专区。unity3d基础入门教学,经典,有图哦!unity 3d 图解经典入门教程 目一、unity3d基础 1、界面学习 2、资.........
unity 2d入门基础教程_计算机软件及应用_it计算机_专业资料。如果用以前版本的...下面的配图可以清晰的看到 2d 和 3d 模式视窗的区别。 -3- 上一个图片也能.........
unity3d游戏开发入门教程_计算机软件及应用_it计算机_专业资料 暂无评价|0人阅读|0次下载|举报文档 unity3d游戏开发入门教程_计算机软件及应用_it计算机_专业资料.........
游戏开发视频教程,龙天职场学校全套教学,在线学习游戏设计课程,使用unity3d进行游戏开发入门教程视频下载......
unity3d 手游开发入门教程—菜鸟在线游戏行业在我国虽然起步比较晚,但是发展......
unity3d入门教程中文版_计算机软件及应用_it计算机_专业资料 暂无评价|0人阅读|0次下载|举报文档unity3d入门教程中文版_计算机软件及应用_it计算机_专业资料。 .........
unity3d入门中文教程_计算机软件及应用_it计算机_专业资料。unity3d 基本操作
建模中使用的图片、文件、文件夹等以及模型中物体、材质等的名称都不能使用中文或.........
vuforia unity3d 使用简易教程 一.下载 vuforia 二 unity3d 导入插件包 完成后 三 获取许可证 进去 develop 登录或注册账号 创建 key 获取 key 四 制作拍摄目标.........
unity3d 安卓开发环境搭建教程之前写过一个 unity3d 安卓开发环境的配置教程,那是我第一次学习配置安卓开发环境, 互联网上的信息良莠不齐,.........
unity3d 手游开发经典教程—菜鸟在线 unity 是由 unity technologies 开发的一个让玩家轻松创建诸如三维视频游 戏、 建筑可视化、 实时三维动画等类型互动内容的多.........
unity3d 入门教程_计算机软件及应用_it计算机_专业资料 暂无评价|0人阅读|0次下载|举报文档 unity3d 入门教程_计算机软件及应用_it计算机_专业资料。.........
■ 24小时热门信息
搜 试试 7 帮助 全部 doc ppt txt pdf xls ...unity3d游戏开发_从入门到精通_01_互联网_it计算机...unity3d游戏开发教程-un... 4页 免费 unity3d游戏.........
搜试试 3 帮助 全部 doc ppt txt pdf xls ...unity 2d入门基础教程_计算机软件及应用_it计算机_...下面的配图可以清晰的看到 2d 和 3d 模式视窗的.........
搜试试 3 帮助 全部 doc ppt txt pdf xls 百度文库 教育专区 高等教育 教育...unity3d ngui 制作字体简易教程 b) unity3d 插件 ngui 的屏幕自适应 c) 界面.........
搜试试 3 帮助 全部 doc ppt txt pdf xls 百度文库 专业资料 it计算机...unity3d入门教程中文版 60页 1下载券
unity3d中文手册 20页 1下载券
中文.........
■ 相关热门内容
unity3d入门中文版教材_it计算机_专业资料
暂无评价|0人阅读|0次下载|举报文档unity3d入门中文版教材_it计算机_专业资料。unity3d入门中文版教材,本人已经学完,.........
unity3d 必备的几种设计模式_计算机软件及应用_it计算机_专业资料。关于unity程序...在此我只做几种设计模式的总结, 主要参考书籍有《设计模式》《设计模式之禅》.........
unity3d编码书写规范_计算机软件及应用_it计算机_专业资料。unity3d 开发、...创业宝典:创业计划书的... 3页 免费
c++编码书写规范 58页 1下载券
编码.........
vr 指南出品 unity3d 开发 vr 第二讲---开始开发 vr 程序作者:vr 指南 接...不知道专业术语叫什么,详 情请看 vr 指南提供的《vr 专属名词讲解》书籍)可以.........
unity3d【如何写好一篇项目需求说明书】_计算机软件及应用_it计算机_专业资料。unity3d基础学习unity3d 学习——如何写好一篇项目需求说明书 需求说明书是一个项目.........
unity3d手机游戏策划案_互联网_it计算机_专业资料...游戏特色:1)......
unity3d界面设计教程_计算机软件及应用_it计算机_专业资料。unity3d界面设计教程...我的法力无边推荐书籍: – 《简约至上:交互式设计四策略》 – 《认知与设计:.........
触发运行一次 } renderer transform pressmouse unity3d物体相互访问 cube1 1 ... 多扩展知识面,多看其它的各种有益书籍,不要整天迷在程序员编程书籍之中。.........
■ 热门推荐在Unity中脚本是必不可少的。因为他将定义你游戏的各种行为和规则。这个教程将介绍JavaScript的基本使用。1.目标在Unity中,脚本是用来界定用户在游戏中的行为或规则。Unity推荐使用的编程语言是JavaScript,同时也支持C#或Boo。2.前提本教程的重点是Unity脚本基础,前提是你已经熟悉了Unity的界面。3.命名规范开始前,先说下Unity的一些规范。变量 - 首写为小写字母。变量用来存储游戏状态中的任何信息。函数 - 首写为大写字母。函数是一个代码块,在需要的时候可以被重复调用。类 - 首写为大写字母。可以被认为是函数的库。当阅读范例时注意首写字母,将有助于你更好的理解对象之间的关系。4.用户输入我们第一个例子是在场景中实现一个简单的移动。1)设置场景:-启动Unity。创建一个用来移动的平面。GameObject-&CreateOther-&Plane。并且在Inspector面板中设置Position为"0,0,0"。如果当前页面没有Inspector面板,选择Window-&Layouts-&2by 3。建议熟悉各种布局以便开发需要。-创建一个Cube。GameObject-&CreateOther-&Cube。在Inspector面板中设置Position为"0,1,0"。-我们都知道现实世界里物体成像靠的是光反射,那么我们这里也是需要光线的。选择GameObject-&CreateOther-&PointLight。在Inspector面板中设置坐标为"0,5,0"。-保存当前场景。快捷键为Ctrl+s。2)新建脚本。我们打算移动用户的视线,这需要通过控制主相机的位置来实现。我们就要写一个脚本,然后把脚本和相机结合起来。-创建一个空脚本。Assets-&Create-&JavaScript并命名为"Move"。重命名快捷键为F2。-双击打开脚本Move。默认包含Update()函数。将我们的代码加入这个函数,他将在每一帧执行一次。我们需要用transform来改变相机的位置,用到Translate这个函数,他有x,y,z三个参数。我们加入以下代码:function Update(){
transform.Translate(Input.GetAxis("Horizontal"),0,Input.GetAxis("Vertical"));
}Input.GetAxis()函数返回一个从-1到1之间的值,如横轴上左半轴为-1到0,右半轴为0到1。如果需要,我们可以通过Edit-&ProjectSettings-&Input中重定义按键映射。3)连接脚本脚本写完了,如何让他起作用呢?我们需要把脚本赋予物体才行。-点击希望应用脚本的物体对象。这里对我们而言就是相机。从Hierarchy面板中选中它。-在菜单中选择Components-&Scripts-&Move,这样我们便从Inspector面板中看到相机中添加了Move这个组件。(我们也可以用鼠标把脚本拖拽到物体对象上)点击运行,我们即可前后左右按键来控制相机移动了。注意一个关于DeltaTime的问题。放在Update()函数中的代码是按照帧来执行的。如果我们需要物体的移动按照时间秒来执行,我们需要将Input.GetAxis()函数的返回值乘以Time.deltaTime:var speed = 5;
function Update(){
var x = Input.GetAxis("Horizontal")*Time.deltaTime*
var y = Input.GetAxis("Vertical")*Time.deltaTime*
transform.Translate(x, y, 0);
}这样设置之后按下WASD便可以实现上下左右的视角移动了。这里的speed为显式变量,可以在Inspector面板中看到。我们可以在使用中随时调整它的值,很方便。5.连接变量Unity允许在界面上拖拽(drag and drop)的方式赋脚本。快捷方便。这里,我们将涉及连接变量的概念。-在场景中添加一个聚光灯。GameObject-&CreateOther-&SpotLight。Position为"0,5,0",Rotation为"90,0,0"。-创建一个JavaScript脚本,命名为"SpotLight"。我们想让聚光灯照向主相机。我们可以使用transform.LookAt()这个函数。如何使用这个函数呢?我们需要创建一个显式变量。在SporLight脚本中写入如下代码:var target : T
function Update(){
transform.LookAt(target);
}-把脚本赋予聚光灯对象。要么在菜单栏Component中添加,要么鼠标拖放。之后,"target"变量就出现在Inspector面板里了。-将Hierarchy面板中的主相机对象拖放到Target变量上。如果我们想让聚光灯照向其他物体,我们也可以将其他物体拖放上去,只要是Transform类型的即可。-运行。你可以看到聚光灯一直照向主相机。6.访问组件一个游戏对象可能有多个脚本或其他组件。它将不可避免的要访问其他组件的函数或变量。Unity中通过GetComponent()函数来实现这个目的。我们现在要实现按下空格键后让聚光灯照向Cube。我们考虑一下这个步骤:1.监视空格键被按下。2.空格键按下后聚光灯照向Cube。由于SporLight脚本中有target变量,我们只需要为这个变量设定新的值就可以了。-创建一个脚本,命名为Switch,添加如下代码:var switchToTarget : T
function Update(){
if(Input.GetButtonDown("Jump"))
GetComponent(SpotLight).target = switchToT
}注意GetComponent()的参数,它将返回一个参数给Switch脚本,我们就可以用它来访问"target"变量。这里的GetComponent获取的不是点光源,而是那个名为SpotLight的JS文件。-添加Switch脚本到聚光灯对象,并将Cube拖放到Inspector面板中的switchToTarge变量上。-运行。按下空格后,聚光灯将照向Cube。 前面我们提到,可以通过写代码的方式指定变量(而不是通过Unity界面),如何做到呢?上面按下空格时告诉聚光灯聚焦到Cube上,我们是在SpotLight脚本中做一个显式的变量,将Cube拖放上去。而在代码中主要有2种方法去实现:1.使用对象的名称(name)2.使用对象的标签(tag)1.对象名称可以从Hierarchy面板上看到对象的名称。用GameObject.Find()函数来使这些名称作为参数。因此,我们可以这样写:function Update(){
if(Input.GetButtonDown("Jump"))
var newTarget = GameObject.Find("Cube").
GetComponent(SpotLight).target = newT
}注意,以上没有出现显式的变量。2.对象标签对象标签是一个字符串,用来识别一个组件。在Inspector面板中点击Tag按钮查看内建的标签。我们也可以创建自己的标签。GameObject.FindWithTag()函数能通过具体的标签寻找组件并返回一个字符串作为参数。function Update(){
if(Input.GetButtonDown("Jump"))
var newTarget = GameObject.FindWithTag("fang").
GetComponent(SpotLight).target = newT
}7.实例我们要在运行时创建(create)对象就要用到Instantiate函数。让我们来实现如何在每次按下开火按钮(鼠标左键或Ctrl键)后通过实例化一个新的对象。需要思考以下几点:1.哪个物体做我们的实例?2.在哪儿实例化?关于第一个问题,最好的办法就是显式变量。这样我们就可以随时通过拖放来改变我们的实例对象。至于在哪儿实例化,我们只要实现当按下开火键时,在用户的当前位置创建一个对象即可。实例化函数有3个参数:1.我们要建立的对象。2.对象的位置坐标。3.对象的旋转位置。完整的代码如下:var newObject : T
function Update(){
if(Input.GetButtonDown("Fire1")){
Instantiate(newObject, transform.position, transform.rotation);
}要记住,transform、position、transform、rotation是附加这个脚本的物体的位置。我们这里假设为主相机。一般情况下,将要被实例化的对象设置为预设(prefab),我们现将Cube设置为预设。-首先,让我们创建一个预置。Assets-&Create-&Prefab。命名为Cube。-从Hierarchy面板中选取Cube拖放到Project面板的Cube上。-创建一个脚本并命名为Create,并把上面的代码加进去。-把这个脚本赋予相机,并将Cube预设赋予脚本变量。-运行。移动相机并按下开火键,你能看到新的Cube出现。8.调试调试是发现和修正你的代码中人为错误的技巧,Unity中提供了Debug类,我们现在看看Debug.Log()函数。Log()函数允许用户发送信息到Unity的控制台。这样做的原因可能包括:1.在运行时要验证某部分代码是否达成。2.报告变量的状态。我们现在使用Log()函数,当用户点击开火按钮时,发送一个消息到Unity控制台。-打开创建的脚本并在"Instantiate"代码内"if"处添加如下代码:Debug.Log("Cube created");-运行。点击开火键,我们能看到Unity界面下方显式"Cube created"。另外一个有用的功能是用于调试私有变量。这使得当Debug模式被选中时Inspector面板中的变量,但它不能被编辑。为了证明这一点,我们将显式一个私有变量作为Cube实例的计数器。我们在脚本中加入两行内容1.添加私有变量cubeCount。2.当一个cube实例创建后增加这个变量完整代码如下:var newObject : T
private var cubeCount = 0;
function Update(){
if(Input.GetButtonDown("Fire1"))
Instantiate(newObject, transform.position, transform.rotation);
Debug.Log("Cube created");
cubeCount++;
Debug.Log(cubeCount);
}9.常见脚本类型//在这个函数体中的代码每隔固定的间隔执行。它通常在Rigibody中有力的作用的时候被用到。如:
// Apply a upwards force to the rigibody every frame
function FixedUpdate(){
rigidbody.AddForce(Vector3.up);
//这里的代码将被用作初始化。
//这个函数在Update()之前,但在Awake()之后执行。
//Start()函数和Awake()函数的不同点在于Start()函数仅在脚本启用时候执行(Inspector面板中的复选框被选中)。
//当游戏对象的碰撞脚本与另一个游戏对象碰撞时执行这个函数内的代码。
OnCollisionEnter(){
//当鼠标在一个载有GUI元素(GUIElement)或碰撞器(Collider)的游戏对象里按下时执行该函数体内的代码。
// Loads the level named "SomeLevel" as a response
// to the user clicking on the object
function OnMouseDown(){
Application.LoadLevel("SomeLevel");
//当鼠标悬停在一个GUI元素或碰撞器的对象上时,执行该函数体内的代码。如:
// Fades the red component of the material to zero
// while the mouse is over the mesh
function OnMouseOver(){
renderer.material.color.r -= 0.1 * Time.deltaT
如果您想留下此文,您可以将其发送至您的邮箱(将同时以邮件内容&PDF形式发送)
相关文章推荐
(Ctrl+Enter提交) &&
已有0人在此发表见解
&在& 17:13收藏到了
&&在信息爆炸的时代,您的知识需要整理,沉淀,积累!Lai18为您提供一个简单实用的文章整理收藏工具,在这里您可以收藏对您有用的技术文章,自由分门别类,在整理的过程中,用心梳理自己的知识!相信,用不了多久,您收藏整理的文章将是您一生的知识宝库!
· 蜀ICP备号-1

我要回帖

更多关于 shell脚本变量 的文章

 

随机推荐