unity 组件添加脚本组件的问题

Current IssueReceive the MSDN Flash e-mail newsletter every other week, with news and information personalized to your interests and areas of focus.ma_haile 的BLOG
用户名:ma_haile
文章数:38
评论数:23
访问量:392597
注册日期:
阅读量:48035
阅读量:2467
[匿名]51cto游客:
51CTO推荐博文
& & 前面几张我们讲解了unity的基本使用, 知道了如何去建立一个简单游戏。 但这不不够, 因为这些需要给游戏添加更多的行为,这样游戏才算有血有肉 &好了不说那么多废话了 下面开始讲正题吧 &咔咔&
& & unity 支持javascript,C#, boo script 语言 &但官方推荐使用 javascript 语言, 对于初学者来说 ,最好使用javascrip 语言,因为简单 易学 ,更容易入门,到了后期推荐使用C# 因为c# &语言更贴近于面向对象的编程思想. 我们先用javascrip来学习吧
下面我们先来了解下unity 脚本的命名规范
& 变量 - 首写为小写字母.变量用来存储游戏状态中的任何信息.
& 函数 - 首写为大写字母.函数是一个代码块,在需要的时候可以被重复调用.
& 类 - 首写为大写字母.可以被认为是函数的库.
&当阅读范例时注意首写字母,将有助于你更好的理解对象之间的关系.
这一章 我们来做一个 如何使用脚本 让一个游戏组件移动的demo 通过学习这一章来让我们的游戏更加完善
新建项目 -& 场景 & 这一步可以不需要导入什么 资源包(不导入是因为在这个示例里面用不上)
新建一个项目后 默认会有一个新的场景 并且在场景里面还有一个摄像机组件
1:首先创建一个用于行走的 plane & 菜单栏 GameObject-&Create Other -&Plane
把Hierarchey&中的plane和摄像机的组件的Inspector属性的 position 的x,y,z 属性的值都设置为0 方便在编辑框编辑
2:创建一个用于移动的 cube 菜单栏 GameObject-&Create Other -&Cube
把Hierarchey中的cube组件的Inspector属性的 position 的x,y,z 属性的值都设置为0
这里如果觉得场景不好看 可以给场景的plane 和 cube添加上图片纹理,和灯光,这边不在阐述了 , 前几章有讲过,呵呵
现在我们来 开始我们第一个脚本
在Project 中点右键 create -&javascript 创建一个js 脚本 如图
重命名该js为MovePlayer.js 并双击该js unity会自己启动 MonoDevelop 编辑器并打开该js&
在脚本中 我们看到一个Update()函数 这个函数中的代码将在游戏中的每一帧调用 所以我们将移动的代码放到这个函数中
在unity 中移动一个对象需要使用 transform 来改变位置(transform 表示游戏组件本身), 那我们就需要通过transfrom的Translate函数 修改 的x,y,z 坐标, 我们先来个简单的哈 使用键盘的 a s w d 这几个键来移动箱子 看看 下面的Update函数代码
function Update(){
& transfrom.Translate(Input.GetAxis(&Horizontal&),0,Input.GetAxis(&Vertical&));
Input.GetAxis() 函数返回-1到1之间的一个值 例如 上面代码Translate函数中的第一个参数 往左移动键映射为-1 右移动键映射为1
在上面的代码中 参数0 代表着y 轴 因为我们不需要cube 上下移动
Horiaontal和Verical 为 unity 输入按键映射 这几个按键映射是 unity 默认给我们预制的 在菜单 edit-&Project Settings-&input 的inspector 窗口下面 axes 下面可以很清楚看到按键映射关系 同样你可以修改它
3: &连接脚本
&我们想移动那个游戏组件,在这里当然是cube 啦 那我们就把刚刚写的那个MovePlayer.js连接到我们要移动的那个游戏组件上 ,那这个游戏组件就拥有了这个脚本的行为了&
那如何连接呢
& 在Hierarchy 中选中想要拥有这个脚本行为的的游戏组件 然后在菜单栏中 & & & &Componect-& scripts 就可以看到你刚写的脚本文件了 如图
如上图 scripts &下面的move Player就是我们刚刚写的脚本文件了 点击它 就可以附加到 游戏组件上了 &
还有种方法是 可以直接把Project 中的Move Player脚本文件 直接选中拖到Horiaontal 下面的游戏组件上 &这种方法更方便 直观 快捷
&给游戏组件添加脚本行为后 就可以再这个游戏组件的inspector 窗口看到我们添加的脚本文件了
小提示: 上图中 右下侧那个方框内 script &后面的那个 小三角形 点击它可以选择别的脚本文件哦 &那个齿轮样的 图标可以 移除脚本文件和重置这个脚本文件的值等
到这一步 可以就可以使游戏组件 cube 动起来了 运行游戏 使用 a,d,w,s 来控制方向 看看效果吧 &但我们发现 貌似这个组件运行的太快了,那我们有办法处理吗? &当然有了 各位盆友继续往下看哈
上面我们 是 按帧数去移动 现在我们按秒去移动 即每秒移动 多少个距离
如果按这种方式去实现 &我们需要将Input.GetAxis()函数的返回值乘于Time.deltaTime 在乘于 一个移动距离 & 重新编辑MovePlayer.js
var speed=5.0;
function Update () {
var x=Input.GetAxis(&Horizontal&)*Time.deltaTime*
var z=Input.GetAxis(&Vertical&)*Time.deltaTime*
transform.Translate(x,0,z);
上面的代码就实现了 每秒 移动的多少距离 这样就和帧数无关了
保存上面代码 重新运行游戏 试试效果是不是看着顺畅很多
注意:移动的速度除了 在代码中修改, 还可以再这个脚本所连接的游戏组件的检视面板中修改 , 这就称为变量暴露 &这种方式修改会比直接在代码中修改方便的多 如下图
如何调试脚本
Log()函数允许用户向控制台发送信息
例如: &把 Debug.Log(&show cube&); 这断代码放到Update() 函数中 允许游戏就可以再 unity 的下边看到 show cube 字样 &双击字样就可以看到控制台日志了
各位童鞋 如果想了解脚本中常用的方法 可以 进入下面地址查看
&各位童鞋 这章就到这里了 & 欢迎各位大小盆友 留言讨论 &
&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
16:24:47 08:33:35unity 脚本中获得游戏对象 - - 泰课在线 - 游戏开发与移动开发在线课程|IT技术网络课堂|Taikr泰课网|Unity3D培训|北京Unity培训|Unity企业培训|Unity程序员培训|Unity学习|Unity自学|Unity视频教程|Unity教程|Unity就业班 - Powered by EDUSOHO
脱产班咨询:电话:
发表于 12-29
335 次查看
在Unity3D中,unity 脚本中获得游戏对象(GameObject)的行为是由附加其上的脚本来控制的,游戏开发者通过编写脚本来控制游戏中的所有对象,如移动Camera等。GameObject可以被附加不同类型的组件,但每种类型的组件只能有一个或没有。脚本本质上也是一种组件。
在Unity3D中默认的脚本代码如下所示:
&span style="font-family:A"&&span style="font-family:A"&// ***** C# script *****
using UnityE
using System.C
public class ffc : MonoBehaviour {
// Use this for initialization
void Start () {
/ Update is called once per frame
void Update () {
//***** Java script *****
#pragma strict
function Start () {
function Update () {
&/span&&/span&
由此可见,脚本代码与大家熟悉的Java代码类似,即都是由以下两部分组成:
? 其它代码:在任何函数之外的代码在物体被加载的时候运行。这个可以用来初始化脚本状态。
MonoBehaviour是所有脚本的基类,每个Javascript脚本自动继承MonoBehaviour,使用C#或Boo时,需要显式继承MonoBehaviour.
1. 脚本成员变量
脚本变量就是指类的成员变量(即在JavaScript或C#或Boo中定义的成员变量,而不是基类MonoBehaviour中定义的变量),在Unity3D中将成员变量设为公有的时候,当把它附加到游戏对象后,可以在游戏对象的监视面板中的脚本组件那栏里面看到该“公有变量”,即可以在编辑器中直接对该公有变量进行赋值,同时在Debug状态下也可以在面板中看到它的值。
2. 控制游戏对象(GameObject)
在Unity3D中,可以在监视器面板中修改物体的组件属性,但是更多的时候,需要使用脚本来进行动态操作。
3. 访问组件
最常见的一个情形是需要使用脚本访问附加到相同游戏对象(GameObject)上的另一个组件(当前脚本就是一个组件,其他的组件也就是另一个组件了)。一个组件实质上是一个类的实例,因而首先需要做的是获取想要操作的组件实例的引用。这个通过GetComponent函数来实现。典型的,可能会想要将一个组件赋值给一个变量,如下代码所示:
【csharp】 view plaincopy在CODE上查看代码片派生到我的代码片
void Start () {
Rigidbody rb = GetComponent&Rigidbody&();
一旦获取了组件实例的引用,就可以对它的属性进行想要的操作,同时也可以调用它的一些功能函数。
如果想要访问另一个脚本文件,也可以使用GetComponent,只需使用脚本的类名作为该函数的组件类型参数(因为脚本本来就也是一个组件)。
【csharp】 view plaincopy在CODE上查看代码片派生到我的代码片
// You can access script components in the same way as other components.
function Start () {
var someScript : ExampleS
someScript = GetComponent (ExampleScript);
someScript.DoSomething ();
如果想要去获取一个并没有添加到当前游戏对象的组件,GetComponent函数会返回null,如果试图去改变一个null对象上的任何值,将会发生null引用错误。
由于一些组件类型经常使用,unity提供了一些内置的变量来访问它们,参见1.2(内置变量),其示例代码如下:
【csharp】 view plaincopy在CODE上查看代码片派生到我的代码片
void Start () {
transform.position = Vector3.
4. 访问其他对象
虽然游戏对象(GameObject)都有各自的组件(包括脚本)进行处理,使用代码进行跟踪其他物体是常有的事。例如,一个追赶的敌人可能需要知道玩家的位置,Unity提供了一系列的方法来获取其他对象,以适合不同的场合。
5. 将对象【静态】链接到公有成员变量
最直接的办法是将一个游戏对象添加到脚本的公有成员变量上,直接在编辑器中将需要访问的游戏对象拖到对应脚本组件的那个公有成员变量上,Unity3D会自动根据变量的类型将添加的游戏对象中相同的组件类型映射到该变量。
例如将一个游戏对象拖给一个Transform的成员变量,就会自动的将游戏对象的Transform组件和该变量映射起来。
直接将对象和变量链接起来在处理需要有永久链接的对象的时候是最有用的方法。同时也可以使用一个数组变量和几个相同类型的对象链接起来,但是这种链接必须在Unity3D编辑器中完成,而不能在运行时进行。
6. 【动态】定位其它对象
你还没有登录,请先或!
(大小不能超过2MB,文件类型支持png ,jpg ,gif ,doc ,xls ,txt ,rar ,zip .)Unity3D脚本--常用代码集 - MyArrow的专栏
- 博客频道 - CSDN.NET
5385人阅读
1. 访问其它物体
1) 使用Find()和FindWithTag()命令
Find和FindWithTag是非常耗费时间的命令,要避免在Update()中和每一帧都被调用的函数中使用。在Start()和Awake()中使用,使用公有变量把它保存下来,以供后面使用。如:
& 公有变量= GameObject.Find(&物体名&); 或
& 公有变量= GameObject.FindWithTag(&物体标签名&);
2) 把一个物体拖到公有变量上
3) 引用脚本所在的物体的组件上的参数,如下所示:
transform.position = Vector3(0,5,4);
renderer.material.color = Color.
light.intensity = 8;
4) SendMessge()命令:一个调用其它物体上指令(即物体上的脚本中的函数)的方法
5) GetComponent()命令:引用一个组件
实例代码如下所示:
#pragma strict
var thelight:GameO
var thetxt:GameO
var theCube1:GameO
function Start () {
thelight = GameObject.Find(&Spotlight&);
thetxt = GameObject.FindWithTag(&txt&);
theCube1 = GameObject.Find(&Cube1&);
function Update () {
if(Input.GetKey(KeyCode.L)){
thelight.light.intensity += 0.01;
thetxt.GetComponent(GUIText).text = &当前亮度:&+thelight.light.
if(Input.GetKey(KeyCode.K)){
thelight.light.intensity -= 0.01;
thetxt.GetComponent(GUIText).text = &当前亮度:&+thelight.light.
if(Input.GetKey(KeyCode.S)){
theCube1.SendMessage(&OnMouseDown&); //调用theCube1所有脚本中的OnMouseDown函数
2. 制作第一人称控制器
& & 第一人称控制器脚本代码如下所示:
#pragma strict
var speed:float=6.0;
var jumpspeed:float=8.0;
var gravity:float=20.0;
private var movedirection:Vector3=Vector3.
private var grounded:boolean=
function Start () {
function FixedUpdate () {
if(grounded){
movedirection=Vector3(Input.GetAxis(&Horizontal&),0,Input.GetAxis(&Vertical&));
//Transforms direction from local space to world space.
movedirection=transform.TransformDirection(movedirection);
movedirection *=
if(Input.GetButton(&Jump&)){
movedirection.y =
movedirection.y -= gravity*Time.deltaT
//Move command
var controller:CharacterController = GetComponent(CharacterController);
var flags = controller.Move(movedirection*Time.deltaTime);
//CollisionFlags.CollidedBelow
底部发生了碰撞
//CollisionFlags.CollidedSides 四周发生了碰撞
//CollisionFlags.CollidedAbove 顶端发生了碰撞
grounded = (flags & CollisionFlags.CollidedBelow)!=0;
//强制Unity为本脚本所依附的物体增加角色控制器组件
@script RequireComponent(CharacterController)
3. 导入3DMax模型
& & 在3DMax(.fbx文件)把显示单位和系统单位设置为cm,再导入到Unity3D(单位为m)中时,则大小相同。
4. 交互功能(自动开关门)
4.1 ControllerColliderHit(碰撞检测) & &
& & 玩家撞到门时,门才能开。
& & 其相关代码如下所示,需要对模型的动画进行分割,以下脚本绑在玩家身上:
#pragma strict
private var doorisopen:boolean =
private var doortimer:float = 0.0;
private var currentdoor:GameO
var door_open_time:float = 5.0;
var door_open_sound:AudioC
var door_shut_sound:AudioC
function Update(){
if(doorisopen){
doortimer += Time.deltaT
if(doortimer & door_open_time) {
doortimer = 0.0;
door(false,door_shut_sound,&doorshut&,currentdoor);
//检测玩家是否与门相撞
function OnControllerColliderHit(hitt:ControllerColliderHit){ //hitt为与玩家相撞的碰撞体
print(&test1&);
if(hitt.gameObject.tag == &playerDoor& && doorisopen == false){
print(&test2&);
door(true,door_open_sound,&dooropen&,hitt.gameObject);
currentdoor = hitt.gameO
function door(doorcheck:boolean,a_clip:AudioClip,ani_name:String,thisdoor:GameObject){
doorisopen=
thisdoor.audio.PlayOneShot(a_clip); //声音取消3D效果,否则无法播放
thisdoor.transform.parent.animation.Play(ani_name);
4.2&RaycastHit(光线投射)
& & & 玩家必须面对门时,光线投射到门时,门才能开。
& & & 其检测碰撞代码如下所示,以下脚本绑在玩家身上:
function Update(){
var hit:RaycastH //hit为与投射光线相遇的碰撞体
if(Physics.Raycast(transform.position,transform.forward,hit,3)){
print(&collider happen& + hit.collider.gameObject.tag);
if(hit.collider.gameObject.tag == &playerDoor&){
var currentdoor:GameObject = hit.collider.gameO
currentdoor.SendMessage(&doorcheck&);
print(&call doorcheck&);
& & & &门身上的脚本如下所示:
#pragma strict
private var doorisopen:boolean =
private var doortimer:float = 0.0;
//private var currentdoor:GameO
var door_open_time:float = 5.0;
var door_open_sound:AudioC
var door_shut_sound:AudioC
function Update(){
if(doorisopen){
doortimer += Time.deltaT
if(doortimer & door_open_time) {
doortimer = 0.0;
door(false,door_shut_sound,&doorshut&);
function doorcheck(){
if(!doorisopen){
door(true,door_open_sound,&dooropen&);
function door(doorcheck:boolean,a_clip:AudioClip,ani_name:String){
doorisopen=
audio.PlayOneShot(a_clip); //声音取消3D效果,否则无法播放
transform.parent.animation.Play(ani_name);
4.3 OnTriggerEnter(触发器)
& & & 只要一进入触发区域,门就可以打开。需要特别注意调整小房子的Box Collider的大小和位置。
& & & 以下脚本绑在门所在的小房子上:
#pragma strict
function OnTriggerEnter (col:Collider) { //col为闯入此区域的碰撞体
if(col.gameObject.tag == &Player&){
transform.FindChild(&door&).SendMessage(&doorcheck&);
4.4 OnCollisionEnter
& & & & & & &检测两个普通碰撞体之间的碰撞,需要发力,才能发生碰撞。不能与第一人称控制器发生碰撞。
4.5 交互总结
& & & 1)&OnControllerColliderHit
& & & & & 专门提供给角色控制器使用,以供角色控制器检测与其它物体发生了碰撞。
它与触发模式的碰撞体不能发生碰撞,而且还会穿过其物体。
& & & & & &以下脚本绑定在玩家(第一人称控制器)身上。
function OnControllerColliderHit (hit:ControllerColliderHit) {
if(hit.gameObject.name != &Plane&)
gameObject.Find(&wenzi&).guiText.text = hit.gameObject.
& & & 2)&RaycastHit
& & & & & 它不是一个事件,而是一个命令,可以需要的地方调用它来发射一条光线来进行检测。
& & & & & &可以与触发模式的碰撞体发生碰撞,但也会穿过其物体。& &
& & & & & &以下脚本绑定在玩家(第一人称控制器)身上。&& & & & & &
#pragma strict
var hit:RaycastH
function Update () {
if(Physics.Raycast(transform.position,transform.forward,hit,2)){
if(hit.collider.gameObject.name != &Plane&){
gameObject.Find(&wenzi&).guiText.text = hit.collider.gameObject.
& & & 3) OnTriggerEnter
& & & & & 以下脚本绑定在与第一人称控制器相撞的物体上。
#pragma strict
function OnTriggerEnter (col:Collider) {
gameObject.Find(&wenzi&).guiText.text = col.gameObject.
& & & & 4) OnCollisionEnter
& & & & & & &检测两个普通碰撞体之间的碰撞,需要发力,才能发生碰撞。不能与第一人称控制器发生碰撞。
5. 播放声音
5.1 audio.Play()
& & GameObject有Audio Source组件,且在Audio Source组件中设置了Audio Clip。
5.2 audio.PlayOneShot
var door_open_sound:AudioC //在检测面板中设置audio clip;当然必须有Audio Source组件,但不需要设置Audio Clip
function myAudioPlay(){
audio.PlayOneShot(door_open_sound); //声音取消3D效果,否则无法播放
5.3&AudioSource.PlayClipAtPoint
& & & 此种播放方式最佳,节约资源。
var collectSound:AudioC //在检测面板中设置其值
function pickupCell(){
//临时申请一个AudioSource,播放完了即时销毁
AudioSource.PlayClipAtPoint(collectSound,transform.position);
6. 销毁物体
& & Destroy(gameObject); &//即时销毁物体
& & Destroy(gameObject,3.0); // 3秒之后销毁物体
7. 给刚体增加速度
& & &方法一:
#pragma strict
var throwsound:AudioC
var coconut_bl:R //为预制物体
function Update () {
if(Input.GetButtonDown(&Fire1&)){
audio.PlayOneShot(throwsound);
var newcoconut:Rigidbody = Instantiate(coconut_bl,transform.position, transform.rotation);
newcoconut.velocity=transform.forward*30.0; //设置刚体速度
8. 忽视碰撞命令
& &使用这两个碰撞器碰撞时不发生效果
& &Physics.IgnoreCollision(transform.root.collider,newcoconut.collider,true);&
9. 协同程序及动画播放
& & 协同程序:类似子线程,在运行本代码的同时,运动脚本中的其它代码。
#pragma strict
// this script will be attached to target object
private var beenhit:boolean =
private var targetroot:A
var hitsound:AudioC
var resetsound:AudioC
var resettime:float=3.0;
function Start () {
targetroot = transform.parent.transform.parent.
function OnCollisionEnter (theobject:Collision) {
if(beenhit == false && theobject.gameObject.name == &coconut&){
StartCoroutine(&targethit&); //协同程序:类似子线程,在运行本代码的同时,运动脚本中的其它代码
function targethit(){
audio.PlayOneShot(hitsound); // 播放声音
targetroot.Play(&down&);
// 播放动画
yield new WaitForSeconds(resettime); // wait for 3s
audio.PlayOneShot(resetsound);
targetroot.Play(&up&);
10. 动态添加和删除脚本
#pragma strict
var obj:GameO
var myskin:GUIS
function Start () {
function Update () {
function OnGUI(){
//GUI.skin =
if(GUILayout.Button(&Add_Component&,GUILayout.Height(40),GUILayout.Width(110))){
obj.AddComponent(&xuanzhuan&); // xuanzhuan为一个脚本xuanzhuan。js
if(GUILayout.Button(&Del_Component&,GUILayout.Height(40),GUILayout.Width(110))){
var script:Object = obj.GetComponent(&xuanzhuan&);
Destroy(script);
11. 粒子系统
& & & 粒子系统是在三维空间中渲染出来的二维图像,主要用于表现烟、火、水滴和落叶等效果。
& & & 粒子系统由:粒子发射器、粒子动画器和粒子渲染器组成。
12. for循环和数组
& & & &使用Unity3D内建数组:
var cms:Render[];
fucntion Update(){
for(var co:Render in cms){
co.material.color = Color.
& & & &使用Unity3D非内建数组Array:
var wenzi_bl:GUIT
var arr = new Array(9,12,65,58);
//静态数组
var barr = new Array();
//动态数组
fucntion Start(){
barr.Push(&push1&);
barr.Push(&push2&);
arr.Sort();
wenzi_bl.text = arr.join(&,&) + & ,arr长度:& + arr.length+ & &&& + barr + & barr长度:& + barr.
13. 延时函数及载入新场景
function OnMouseDown () {
audio.PlayOneShot(beep);
yield new WaitForSeconds(0.35);
Application.LoadLevel(levelToload);
14. 创建窗口及此窗口中的内容
static var windowSwitch:boolean =
private var windowRect = Rect(300,280,240,200);
function Update(){
if(Input.GetKeyDown(KeyCode.Escape)){
windowSwitch = !windowS
function OnGUI(){
if(windowSwitch){
windowRect = GUI.Window(0,windowRect,WindowContain,&测试窗口&);
// show window contents
function WindowContain(){
if(GUI.Button(Rect(70,70,100,20),&关闭音乐&)){
gameObject.Find(&Terrain&).GetComponent(AudioSource).enabled =
if(GUI.Button(Rect(70,100,100,20),&播放音乐&)){
gameObject.Find(&Terrain&).GetComponent(AudioSource).enabled =
if(GUI.Button(Rect(70,130,100,20),&关闭窗口&)){
windowSwitch =
if(GUI.Button(Rect(70,160,100,20),&退出游戏&)){
Application.Quit();
GUI.DragWindow(new Rect(0,0,));
15. 菜单制作方法
& & & 1) GUITexture
& & & 2) GUI对象:GUI.Window和GUISkin。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1198475次
积分:14155
积分:14155
排名:第307名
原创:223篇
转载:172篇
评论:255条
(1)(2)(5)(4)(10)(3)(4)(3)(2)(3)(6)(1)(2)(6)(5)(5)(8)(7)(7)(19)(18)(6)(15)(4)(3)(1)(12)(12)(31)(22)(12)(16)(14)(11)(7)(4)(15)(10)(8)(56)(19)

我要回帖

更多关于 unity 删除组件 的文章

 

随机推荐