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.blue;
light.intensity = 8;

4) SendMessge()命令:一个调用其他物体上指令(即物体上的脚本中的函数)的方法

5) GetComponent()命令:引用一个组件

实例代码例如以下所看到的:

#pragma strict
var thelight:GameObject;
var thetxt:GameObject;
var theCube1:GameObject; 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.intensity;
} if(Input.GetKey(KeyCode.K)){
thelight.light.intensity -= 0.01;
thetxt.GetComponent(GUIText).text = "当前亮度:"+thelight.light.intensity;
}
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.zero;
private var grounded:boolean=false; 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 *= speed; if(Input.GetButton("Jump")){
movedirection.y = jumpspeed;
}
}
movedirection.y -= gravity*Time.deltaTime;
//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 = false;
private var doortimer:float = 0.0;
private var currentdoor:GameObject; var door_open_time:float = 5.0;
var door_open_sound:AudioClip;
var door_shut_sound:AudioClip; function Update(){
if(doorisopen){
doortimer += Time.deltaTime; 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.gameObject;
}
} function door(doorcheck:boolean,a_clip:AudioClip,ani_name:String,thisdoor:GameObject){
doorisopen=doorcheck;
thisdoor.audio.PlayOneShot(a_clip); //声音取消3D效果,否则无法播放
thisdoor.transform.parent.animation.Play(ani_name);
}

4.2 RaycastHit(光线投射)

玩家必须面对门时,光线投射到门时,门才干开。

其检測碰撞代码例如以下所看到的,下面脚本绑在玩家身上:

function Update(){
var hit:RaycastHit; //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.gameObject;
currentdoor.SendMessage("doorcheck");
print("call doorcheck");
}
}
}

门身上的脚本例如以下所看到的:

#pragma strict

private var doorisopen:boolean = false;
private var doortimer:float = 0.0;
//private var currentdoor:GameObject; var door_open_time:float = 5.0;
var door_open_sound:AudioClip;
var door_shut_sound:AudioClip; function Update(){
if(doorisopen){
doortimer += Time.deltaTime; 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=doorcheck;
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.name;
}

2) RaycastHit

它不是一个事件,而是一个命令,能够须要的地方调用它来发射一条光线来进行检測。

能够与触发模式的碰撞体发生碰撞,但也会穿过其物体。

下面脚本绑定在玩家(第一人称控制器)身上。

#pragma strict
var hit:RaycastHit;
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.name;
}
}
}

3) OnTriggerEnter

下面脚本绑定在与第一人称控制器相撞的物体上。

#pragma strict
function OnTriggerEnter (col:Collider) {
gameObject.Find("wenzi").guiText.text = col.gameObject.name;
}

4) OnCollisionEnter

检測两个普通碰撞体之间的碰撞,须要发力,才干发生碰撞。不能与第一人称控制器发生碰撞。

5. 播放声音

5.1 audio.Play()

GameObject有Audio Source组件,且在Audio Source组件中设置了Audio Clip。

5.2 audio.PlayOneShot

var door_open_sound:AudioClip; //在检測面板中设置audio clip;当然必须有Audio Source组件,但不须要设置Audio Clip
function myAudioPlay(){
audio.PlayOneShot(door_open_sound); //声音取消3D效果,否则无法播放
}

5.3 AudioSource.PlayClipAtPoint

此种播放方式最佳,节约资源。

var collectSound:AudioClip; //在检測面板中设置其值

function pickupCell(){
//暂时申请一个AudioSource,播放完了即时销毁
AudioSource.PlayClipAtPoint(collectSound,transform.position);
}

6. 销毁物体

Destroy(gameObject);  //即时销毁物体

Destroy(gameObject,3.0); // 3秒之后销毁物体

7. 给刚体添加�速度

方法一:

#pragma strict
var throwsound:AudioClip;
var coconut_bl:Rigidbody; //为预制物体 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 = false;
private var targetroot:Animation;
var hitsound:AudioClip;
var resetsound:AudioClip;
var resettime:float=3.0; function Start () {
targetroot = transform.parent.transform.parent.animation;
} function OnCollisionEnter (theobject:Collision) {
if(beenhit == false && theobject.gameObject.name == "coconut"){
StartCoroutine("targethit"); //协同程序:相似子线程,在执行本代码的同一时候,运动脚本中的其他代码
}
} function targethit(){
audio.PlayOneShot(hitsound); // 播放声音
targetroot.Play("down"); // 播放动画
beenhit = true; yield new WaitForSeconds(resettime); // wait for 3s audio.PlayOneShot(resetsound);
targetroot.Play("up");
beenhit=false;
}

10. 动态加入�和删除脚本

#pragma strict

var obj:GameObject;
var myskin:GUISkin; function Start () { } function Update () { } function OnGUI(){
//GUI.skin = myskin;
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. 粒子系统

粒子系统是在三维空间中渲染出来的二维图像,主要用于表现烟、火、水滴和落叶等效果。

粒子系统由:粒子发射器、粒子动画器和粒子渲染器组成。

Unity3D脚本--经常使用代码集的更多相关文章

  1. Unity3D脚本调用Objective C代码实现游戏内购买

    0.开篇吐槽: 一年之内从WP转到iOS,又从iOS转到U3D,真心伤不起. 1.Unity3D脚本调用OC代码的原理: 其实也没啥神秘的,因为OC是和C互通的 ,C#又可以通过DllImport的形 ...

  2. Unity3D脚本行尾(Line Endings)

    行尾不一致(inconsistent line endings ) 开发环境 有时候编辑Unity的脚本文件,代码diff之后,或者从svn更新文件之后,Unity中会出现行尾不一致的信息. 我的开发 ...

  3. [转]unity3d 脚本参考-技术文档

    unity3d 脚本参考-技术文档 核心提示:一.脚本概览这是一个关于Unity内部脚本如何工作的简单概览.Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的.在脚本对象内部不同志的函数被 ...

  4. Unity3D脚本中文系列教程(十六)

    Unity3D脚本中文系列教程(十五) ◆ function OnPostprocessAudio (clip:AudioClip):void 描述:◆  function OnPostprocess ...

  5. Unity3D脚本中文系列教程(十三)

    http://dong2008hong.blog.163.com/blog/static/469688272014032334486/ Unity3D脚本中文系列教程(十二) ◆ function G ...

  6. Unity3D脚本中文系列教程(十)

    http://dong2008hong.blog.163.com/blog/static/4696882720140312627682/?suggestedreading&wumii Unit ...

  7. Unity3D脚本中文系列教程(九)

    Unity3D脚本中文系列教程(八) name 对象名称hideFlags 该物体是否被隐藏,保存在场景中或被用户修改继承的函数 GetInstanceID 返回该物体的实例id继承的类函数 oper ...

  8. Unity3D脚本中文系列教程(七)

    http://dong2008hong.blog.163.com/blog/static/4696882720140311445677/?suggestedreading&wumii Unit ...

  9. Unity3D脚本中文系列教程(六)

    http://dong2008hong.blog.163.com/blog/static/469688272014031943118/ Unity3D脚本中文系列教程(五) 变量 ◆var colli ...

随机推荐

  1. 38、FragmentStatePagerAdapter分页

    [ ViewPager ] ViewPager 如其名所述,是负责翻页的一个 View.准确说是一个 ViewGroup,包含多个 View 页,在手指横向滑动屏幕时,其负责对 View 进行切换.为 ...

  2. Xamarin Mono Android Ios 安装、破解(4.12)

    一.Windows下面的安装 1. 安装环境介绍: Win8.1 企业版64位.VS2013,mono-android-4.12.02001,下面的安装过程都是在VS2013已经安装成功之后的操作,本 ...

  3. 《Python CookBook2》 第一章 文本 - 过滤字符串中不属于指定集合的字符 && 检查一个字符串是文本还是二进制

    过滤字符串中不属于指定集合的字符 任务: 给定一个需要保留的字符串的集合,构建一个过滤函数,并可将其应用于任何字符串s,函数返回一个s的拷贝,该拷贝只包含指定字符集合中的元素. 解决方案: impor ...

  4. Chrome的网络调试

    F12 然后

  5. DOM笔记(二):Node接口

    所有的节点都使用Node接口来表示,可以使用很多方法去获取节点,如document.getElementsByTagName().document.getElementsByName()等均返回一个N ...

  6. lighttpd+fastcgi模块分析

    一开始不怎么明白fastcgi和cgi的区别,查了资料说,fastcgi多了一个进程池,不要每次都fork和退出 这个不是重点,还是对着代码看吧 怎样在lighttpd运行php呢,需要下面这样配置 ...

  7. FS,FT,DFS,DTFT,DFT,FFT的联系和区别

    DCT变换的原理及算法 文库介绍 对于初学数字信号处理(DSP)的人来说,这几种变换是最为头疼的,它们是数字信号处理的理论基础,贯穿整个信号的处理. 学习过<高等数学>和<信号与系统 ...

  8. Bmob第三方登录详解

    Bmob第三方登录详解 Bmob 第三方登录 简介 本文主要介绍新浪微博,QQ,微信的登录接入以及如何配合BmobSDK中的第三方登录功能实现第三方登录. 在使用之前请先按照快速入门创建好可以调用Bm ...

  9. SRM 509 DIV1 500pt(DP)

    题目简述 给定一个字符串,可以对其进行修改,删除,增加操作,相应的操作有对应的花费,要求你用最小的花费把字符串变为回文串 题目做法 先搞一遍floyed把各种操作的最小花费求出来,然后就是类似编辑距离 ...

  10. hadoop测试环境主配置简例

    1,mapred-site.xml 此配置文件主要是针对mapreduce的配置文件,配置的是jobtracker的地址和端口; <configuration> <property& ...