Unity3D脚本--经常使用代码集
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脚本--经常使用代码集的更多相关文章
- Unity3D脚本调用Objective C代码实现游戏内购买
0.开篇吐槽: 一年之内从WP转到iOS,又从iOS转到U3D,真心伤不起. 1.Unity3D脚本调用OC代码的原理: 其实也没啥神秘的,因为OC是和C互通的 ,C#又可以通过DllImport的形 ...
- Unity3D脚本行尾(Line Endings)
行尾不一致(inconsistent line endings ) 开发环境 有时候编辑Unity的脚本文件,代码diff之后,或者从svn更新文件之后,Unity中会出现行尾不一致的信息. 我的开发 ...
- [转]unity3d 脚本参考-技术文档
unity3d 脚本参考-技术文档 核心提示:一.脚本概览这是一个关于Unity内部脚本如何工作的简单概览.Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的.在脚本对象内部不同志的函数被 ...
- Unity3D脚本中文系列教程(十六)
Unity3D脚本中文系列教程(十五) ◆ function OnPostprocessAudio (clip:AudioClip):void 描述:◆ function OnPostprocess ...
- Unity3D脚本中文系列教程(十三)
http://dong2008hong.blog.163.com/blog/static/469688272014032334486/ Unity3D脚本中文系列教程(十二) ◆ function G ...
- Unity3D脚本中文系列教程(十)
http://dong2008hong.blog.163.com/blog/static/4696882720140312627682/?suggestedreading&wumii Unit ...
- Unity3D脚本中文系列教程(九)
Unity3D脚本中文系列教程(八) name 对象名称hideFlags 该物体是否被隐藏,保存在场景中或被用户修改继承的函数 GetInstanceID 返回该物体的实例id继承的类函数 oper ...
- Unity3D脚本中文系列教程(七)
http://dong2008hong.blog.163.com/blog/static/4696882720140311445677/?suggestedreading&wumii Unit ...
- Unity3D脚本中文系列教程(六)
http://dong2008hong.blog.163.com/blog/static/469688272014031943118/ Unity3D脚本中文系列教程(五) 变量 ◆var colli ...
随机推荐
- 1045 整数礼物 c语言
描述 Na 给准备送给ZZ两个整数,a, b,他还计算了这两个整数的平均值c,碰巧c也是整数. 但是Na 突然把b给弄丢了,你要帮助Na通过a, c计算出来b的值. 输入 输入为一行,两个用空格隔开的 ...
- C#中的值类型(value type)与引用类型(reference type)的区别
ylbtech- .NET-Basic:C#中的值类型与引用类型的区别 C#中的值类型(value type)与引用类型(reference type)的区别 1.A,相关概念返回顶部 C#中 ...
- CABasicAnimation
几个可以用来实现热门APP应用PATH中menu效果的几个方法 +(CABasicAnimation *)opacityForever_Animation:(float)time //永久闪烁的动画 ...
- DateTime.IsLeapYear 方法判断是否是闰年,DaysInMonth判断一个月有几天,Addday取得前一天的日期GetYesterDay
一:DateTime.IsLeapYear 方法判断是否是闰年 二:代码 using System; using System.Collections.Generic; using System.Co ...
- 【和我一起学Python吧】Python3.0与2.X版本的区别
做为一个前端开发的码农,却正在阅读最新版的<A byte of Python>.发现Python3.0在某些地方还是有些改变的.准备慢慢的体会,与老版本的<A byte of Pyt ...
- php里面为什么header之前有输出报错 源码分析
众所周知,php 里面 header之前有输出的话,会报错,例如下面这样 就这个错误,我们开始查阅php源代码,到底是怎样做的,至于php源代码分析,安装,和调试时怎样配置的,我会专门写一篇文章去 ...
- Educational Codeforces Round 14
A - Fashion in Berland 水 // #pragma comment(linker, "/STACK:102c000000,102c000000") #inclu ...
- .net mvc HtmlHelper扩展使用
如果是你是从webform开始接触.net,你应该记得webform开发中,存在自定义控件这东西,它使得我们开发起来十分方便,如今mvc大势所趋,其实在mvc开发时,也存在自定义控件这么个东西,那就是 ...
- Google C++ 编程规范总结
一.头文件 #define 的保护 项目 foo 中的头文件 foo/src/bar/baz.h 按如下方式保护: #ifndef FOO_BAR_BAZ_H_ #define FOO_BAR_BAZ ...
- 教你区分LVDS屏线及屏接口定义
现在碰到液晶屏大多是LVDS屏线,经常碰到什么单6,双6 单8双8.如何区分呢?我以前也不知道,后在网上收集学习后才弄明白方法1数带 “ -”的这种信号线一共有几对,有10对的减2对就是双8,有8对的 ...