不知不觉大四了,对于毕业不知道能干些什么。写这个博客的目的有两个:一是想在毕业以前,把以前学过的东西从新的复习一下。二是本人英语不好,想借此来锻炼一下自己的英语水平。一下内容翻译unity官网脚本手册,以前总是看别人翻译好的,现在想自己尝试看看,我知道错误百出,请各位看客,多多指教。官网地址:http://docs.unity3d.com/Manual/ControllingGameObjectsComponents.html

用组件控制物体

在unity编辑器中,你可以改变检查器中组件的属性。于是,例如,改变位置组件的位置就能导致物体位置的改变。类似的,你也能改变渲染材质的颜色或者在外观上对物体的相对影响或者物体的行为。对大部分而言,脚本也能编辑组件的属性去操作物体。这不同点虽然,这个脚本能逐步改变属性值在一段时间里或者对用户输入的做出反应。通过改变,创建和摧毁物体在这个时间里,任何一种游戏可以实现。


访问组件



这最基本并且最常见的例子是一个脚本需要访问同一个物体上的的其他组件。正如介绍章节介绍,一个组件实际上是一个类的例子于是第一步是给一个接口到你想工作的例子组件中。这有一个“getComponent”函数,典型的,你想分配一个组件物体到一个变量中,在c#用到如下语法:



void Start(){
 
 
  Rigidbodyrb=GetComponent<Rigidbody>();
 
 
}



一旦你有一个组件实例的接口,你将能设置他的大部分属性在检索视图中:



Void Start(){
 
 
  Rigidbodyrb=GetComponent<Rigidbody>();
 
 
  Rb.mass=10f;
 
 
}



一个额外的在检索视图中不可用的特征是多用实例组件函数的可能性:



Void Start(){
   Rigidbody rb=GetComponent<Rigidbody>(); 
 
//添加一个力给刚体组件
 
 
rb.AddForce(Vector3.up*10f);
 
 
}



注意这里是没有原因的,至于你为什么不能有更多的自定义脚本添加到一个物体上面。如果你需要引入一个脚本从另一个物体上面,你也能GetComponent像以前一样,并且仅仅用脚本类的名字(或者文件的名字)来达到你想用的特殊组件类型的目的。



如果你视图取回一个实际上不添加到物体上的组件,然后得到组件将返回空值;你将得到一个空的接口错误在运行时候,如果你尝试改变一个空物体的任何数值。



一些组件类型经常被利用,unity提供内置的变量去调用他们在monobehaviour中,例如:



void Start(){
 
 
    transform.position=Vector3.zero;
 
 
}



不是第一次用GetComponent组件调用Transform组件了啊,这所有的内置组件变量列表在monibehaviour脚本接口页面列出。注意,如果你希望组件不绑定到物体上面,然后这个变量将包含一个空置。



引入其他物体



随他他们独立操作,可以他们常常保持其他物体的联系。例如,一个追捕敌人可能需要知道这个人物的位置。Unity提供了大量的不同的方法来获取其他物体,每一个都分配给确定的情况下。



物体跟变量联系起来



这最直接的方式是发现一个有关联的物体死添加一个公共的物体变量给脚本:



public class Enemy:MonoBehaviour{
 
 
publicGameObject player;
 
 
//其他的变量和函数
 
 
}



这个变量将会被显示在检索视图中想其他变量一样:



 



现在你也能从层次面板或者场景视图中拖拽物体到变量中去使用它。获取组件函数和组件应用变量对这个物体来说是可变的,就像其他一样。如下:



public class:Enemy:MonoBehaviour{
 
 
publicGameObject player;
 
 
voidStart(){
 
 
  transform.position=player.transform.position-Vector3.forward*10f;
 
 
}
 
 
}



此外,如果你在你的脚本里声明一个公共的组件类型变量,你能拖拽任何绑定到它上面的物体。这将直接引用组件而不是物体体它自己。



public TransformplayerTransform;



当你处理有不变的联系的独立物体的时候,把物体和变量联系起来是很有用的。你也能通过数值变量来联系相同类型的几个物体,可是联系必须是在unity的编辑模式下面而不是在运行时候。对本地物体在运行时候是很方便的并且提供两个基本的方式去做这个,如下描述:



寻找子物体



有时候,一个游戏场景将使用同样类型的大量物体,例如,敌人,路径和障碍。这些可能需要被一个特殊的监管或者对他们做出反应的脚本脚本监控(例如:所有的路径可能需要一个变量来储存一个自动寻路的脚本)。用这个变量来联系这些物体是可能的可是如孤傲每一个新的路径都需要拖拽到脚本上的一个变量,这将是整个设计过程乏味枯燥。同样的,如果一个路点被删除,那么移除所有的变量接口来丢失物体是很让人讨厌的。像这样的例子,最好设置一个物体来操作所有的他的子物体。这个子物体就能重新使用他的父物体的组件(所有的物体都含蓄的有一个位置组件)



Public Transformwaypoints;
 
 
Void Start(){
 
 
  Waypoints=new Transform[transform.childCount];
 
 
inti=0;
 
 
for(Transformt in transform){
 
 
waypoints[i++]=t;
 } 
 
}



你也能确定一个特殊的子物体名字通过用Transform.Find函数。


Transform.Find(“Gun”);



当一个物体有一个子物体,在它运行时候可以随时添加和移除的子物体的时候,它就很有用了。一个武器能被捡起和放下一个好例子;



通过名字和标签寻找物体



只有你有一些信息去识别他们,确定物体在场景视图中的位置是可能的。独立的物体能够重新取回名字,用 GameObject.Find函数:



GameObject player;
 
 
void Start(){
 
 
   player=Gameobject.Find(“MainHeroCharacter”);
 
 
}



一个物体或者一个物体的碰撞也能通过应用GameObject.FindWithTag和GameObject.FindGameObjectsWithTag函数


GameObject player;
 
  
 
GameObject[] enemies;
 
  
 
 
 
  
 
 voidStart() {
 
  
 
   player = GameObject.FindWithTag("Player");
 
  
 
   enemies =GameObject.FindGameObjectsWithTag("Enemy");
 
  
 
}