位置: 编程技术 - 正文

【Unity】技巧集合(unity操作教程)

编辑:rootadmin

推荐整理分享【Unity】技巧集合(unity操作教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:unity_jail,unity小技巧,unity小技巧,unity ulua,unity ulua,unity-,unity-,unity-,内容如对您有帮助,希望把文章链接给更多的朋友!

转载: “Hierarchy”中复制相关对象树,暂停游戏后替换原来的,就可以了。(其实这个拷贝过程是序列化过程,这种方法是序列化到内存中;另外一种方法就是序列化到磁盘上,即把内容拖动到文件夹中变成prefab,效果也是一样的)

2)Layer的用法

LayerMask.NameToLayer("Ground"); // 通过名字获取layer

3D Raycast

[csharp] view plaincopyRaycastHit hit; if(Physics.Raycast(cam3d.ScreenPointToRay(Input.mousePosition), out hit, Mathf.Infinity, (1<<LayerMask.NameToLayer("Ground")))) { ... }

2D Raycast

[csharp] view plaincopyCollider2D h = Physics2D.OverlapPoint(cam2d.ScreenToWorldPoint(Input.mousePosition), (1<<LayerMask.NameToLayer("xxx"))); if(h) { ... }

3)物理摄像头取色(WebCamTexture)

[csharp] view plaincopyTexture2D exactCamData() { // get the sample pixels Texture2D snap = new Texture2D((int)detectSize.x, (int)detectSize.y); snap.SetPixels(webcamTexture.GetPixels((int)detectStart.x, (int)detectStart.y, (int)detectSize.x, (int)detectSize.y)); snap.Apply(); return snap; }

保存截图:

[csharp] view plaincopySystem.IO.File.WriteAllBytes(Application.dataPath &#; "/test.png", exactCamData().EncodeToPNG());

4) 操作componenent

添加:

[csharp] view plaincopyCircleCollider2D cld = (CircleCollider2D)colorYuan[i].AddComponent(typeof(CircleCollider2D)); cld.radius = 1;

删除:

[csharp] view plaincopyDestroy(transform.gameObject.GetComponent<SpriteRenderer>());

5)动画相关

状态Init到状态fsShake的的条件为:参数shake==true;代码中的写法:

触发fsShake:

[csharp] view plaincopyvoid Awake() { anims = new Animator[(int)FColorType.ColorNum]; } .... if(needShake) { curAnim.SetTrigger("shake"); } 关闭fsShake

[csharp] view plaincopyvoid Update() { .... if(curAnim) { AnimatorStateInfo stateInfo = curAnim.GetCurrentAnimatorStateInfo(0); if(stateInfo.nameHash == Animator.StringToHash("Base Layer.fsShake")) { curAnim.SetBool("shake", false); curAnim = null; print ("======>>>>> stop shake!!!!"); } } .... }

关于Animator.StringToHash函数的说明:

animator的setBool,setTrigger等函数都有两种参数形式,一个接收string,一个接收hash;其实Animator内部是使用hash来记录相应信息的,所以接收string类型的函数内部会帮你调用StringToHash这个函数;所以如果要经常调用setTrigger等,请把参数名称hash化保持以便反复使用,从而提高性能。

在状态机animator中获取animation state 和animation clip的方法(参考 view plaincopypublic static AnimationClip getAnimationClip(Animator anim, string clipName) { UnityEditorInternal.State state = getAnimationState(anim, clipName); return state!=null ? state.GetMotion() as AnimationClip : null; } public static UnityEditorInternal.State getAnimationState(Animator anim, string clipName) { UnityEditorInternal.State state = null; if(anim != null) { UnityEditorInternal.AnimatorController ac = anim.runtimeAnimatorController as UnityEditorInternal.AnimatorController; UnityEditorInternal.StateMachine sm = ac.GetLayer(0).stateMachine; for(int i = 0; i < sm.stateCount; i&#;&#;) { UnityEditorInternal.State _state = sm.GetState(i); if(state.uniqueName.EndsWith("." &#; clipName)) { state = _state; } } } return state; }

6)scene的切换

同步方式:

[csharp] view plaincopyApplication.LoadLevel(currentName);

异步方式:

[csharp] view plaincopyApplication.LoadLevelAsync("ARScene");

7)加载资源

[csharp] view plaincopyResources.Load<Texture>(string.Format("{0}{1:D2}", mPrefix, 5));

8)Tag VS. Layer

-> Tag用来查询对象

-> Layer用来确定哪些物体可以被raycast,还有用在camera render中

9)旋转

transform.eulerAngles 可以访问 rotate的 xyz

[csharp] view plaincopytransform.RotateAround(pivotTransVector, Vector3.up, -0.5f * (tmp-preX) * speed); )保存数据[csharp] view plaincopyPlayerPrefs.SetInt("isInit_" &#; Application.loadedLevelName, 1);

)动画编码

遍历子对象

[csharp] view plaincopyTransform[] transforms = target.GetComponentsInChildren<Transform>(); for (int i = 0, imax = transforms.Length; i < imax; &#;&#;i) { Transform t = transforms[i]; t.gameObject.SendMessage(functionName, gameObject, SendMessageOptions.DontRequireReceiver); }

)音效的播放

先添加Auido Source, 设置Audio Clip, 也可以在代码中加入。然后在代码中调用audio.Play(), 参考如下代码:

[csharp] view plaincopypublic AudioClip aClip; ... void Start () { ... audio.clip = aClips; audio.Play(); ... }

另外,如果是3d音效的话,需要调整audio Souce中的panLevel才能听到声音,不清楚原因。

【Unity】技巧集合(unity操作教程)

)调试技巧(Debug)

可以在OnDrawGizmos函数来进行矩形区域等,达到调试的目的,请参考NGUI中的UIDraggablePanel.cs文件中的那个函数实现。

[csharp] view plaincopy#if UNITY_EDITOR /// <summary> /// Draw a visible orange outline of the bounds. /// </summary> void OnDrawGizmos () { if (mPanel != null) { Bounds b = bounds; Gizmos.matrix = transform.localToWorldMatrix; Gizmos.color = new Color(1f, 0.4f, 0f); Gizmos.DrawWireCube(new Vector3(b.center.x, b.center.y, b.min.z), new Vector3(b.size.x, b.size.y, 0f)); } } #endif

)延时相关( StartCoroutine)

[csharp] view plaincopyStartCoroutine(DestoryPlayer()); ... IEnumerator DestoryPlayer() { Instantiate(explosionPrefab, transform.position, transform.rotation); gameObject.renderer.enabled = false; yield return new WaitForSeconds(1.5f); gameObject.renderer.enabled = true; }

)Random做种子

[csharp] view plaincopyRandom.seed = System.Environment.TickCount; 或者 Random.seed = System.DateTime.Today.Millisecond;

) 调试技巧(debug),可以把&#;方便地在界面上打印出来

[csharp] view plaincopyvoid OnGUI() { GUI.contentColor = Color.green; GUILayout.Label("deltaTime is: " &#; Time.deltaTime); } )分发消息

sendMessage, BroadcastMessage等

) 游戏暂停(对timeScale进行设置)

[csharp] view plaincopyTime.timeScale = 0;

) 实例化一个prefab

[csharp] view plaincopyRigidbody2D propInstance = Instantiate(backgroundProp, spawnPos, Quaternion.identity) as Rigidbody2D;

)Lerp函数的使用场景

[csharp] view plaincopy// Set the health bar's colour to proportion of the way between green and red based on the player's health. healthBar.material.color = Color.Lerp(Color.green, Color.red, 1 - health * 0.f);

)在特定位置播放声音

[csharp] view plaincopy// Play the bomb laying sound. AudioSource.PlayClipAtPoint(bombsAway,transform.position);

) 浮点数相等的判断(由于浮点数有误差, 所以判断的时候最好不要用等号,尤其是计算出来的结果)

[csharp] view plaincopyif (Mathf.Approximately(1.0, .0/.0)) print ("same");

)通过脚本修改shader中uniform的&#;

[csharp] view plaincopy//shader的写法 Properties { ... disHeight ("threshold distance", Float) = 3 } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag ... uniform float disHeight; ... // =================================== // 修改shader中的disHeight的&#; gameObject.renderer.sharedMaterial.SetFloat("disHeight", height);

) 获取当前level的名称

[csharp] view plaincopyApplication.loadedLevelName

)双击事件

[csharp] view plaincopyvoid OnGUI() { Event Mouse = Event.current; if ( Mouse.isMouse && Mouse.type == EventType.MouseDown && Mouse.clickCount == 2) { print("Double Click"); } }

) 日期:

[csharp] view plaincopySystem.DateTime dd = System.DateTime.Now; GUILayout.Label(dd.ToString("M/d/yyyy"));

) RootAnimation中移动的脚本处理

[csharp] view plaincopyclass RootControl : MonoBehaviour { void OnAnimatorMove() { Animator anim = GetComponent<Animator>(); if(anim) { Vector3 newPos = transform.position; newPos.z &#;= anim.GetFloat("Runspeed") * Time.deltaTime; transform.position = newPos; } } }

) BillBoard效果(广告牌效果,或者向日葵效果,使得对象重视面向摄像机)

[csharp] view plaincopypublic class BillBoard : MonoBehaviour { // Update is called once per frame void Update () { transform.LookAt(Camera.main.transform.position, -Vector3.up); } }

)script中的属性编辑器(Property Drawers),还可以自定义属性编辑器

参考: view plaincopypublic class Example : MonoBehaviour { public string playerName = "Unnamed"; [Multiline] public string playerBiography = "Please enter your biography"; [Popup ("Warrior", "Mage", "Archer", "Ninja")] public string @class = "Warrior"; [Popup ("Human/Local", "Human/Network", "AI/Easy", "AI/Normal", "AI/Hard")] public string controller; [Range (0, )] public float health = ; [Regex (@"^(?:d{1,3}.){3}d{1,3}$", "Invalid IP address!nExample: '.0.0.1'")] public string serverAddress = "..0.1"; [Compact] public Vector3 forward = Vector3.forward; [Compact] public Vector3 target = new Vector3 (, , ); public ScaledCurve range; public ScaledCurve falloff; [Angle] public float turnRate = (Mathf.PI / 3) * 2; }

)Mobile下面使用lightmapping问题的解决方案

在mobile模式下,lightmapping可能没有反应,可以尝试使用mobile下的shader,可以解决问题。更多请参考: Unity下画线的功能(用于debug)

[csharp] view plaincopyDebug.DrawLine (Vector3.zero, new Vector3 (, 0, 0), Color.red);

)Shader中代码的复用(CGINCLUDE的使用)

[cpp] view plaincopyShader "Self-Illumin/AngryBots/InterlacePatternAdditive" { Properties { _MainTex ("Base", 2D) = "white" {} //... } CGINCLUDE #include "UnityCG.cginc" sampler2D _MainTex; //... struct v2f { half4 pos : SV_POSITION; half2 uv : TEXCOORD0; half2 uv2 : TEXCOORD1; }; v2f vert(appdata_full v) { v2f o; // ... return o; } fixed4 frag( v2f i ) : COLOR { // ... return colorTex; } ENDCG SubShader { Tags {"RenderType" = "Transparent" "Queue" = "Transparent" "Reflection" = "RenderReflectionTransparentAdd" } Cull Off ZWrite Off Blend One One Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma fragmentoption ARB_precision_hint_fastest ENDCG } } FallBack Off }

)获取AnimationCurve的时长

[csharp] view plaincopy_curve.keys[_curve.length-1].time;

)C#中string转变成byte[]:

[csharp] view plaincopybyte[] b1 = System.Text.Encoding.UTF8.GetBytes (myString); byte[] b2 = System.Text.Encoding.ASCII.GetBytes (myString); System.Text.Encoding.Default.GetBytes(sPara) new ASCIIEncoding().GetBytes(cpara); char[] cpara=new char[bpara.length]; for(int i=0;i <bpara.length;i &#;&#;){char[i]=system.convert.tochar(bpara[i]);}

) 排序

[csharp] view plaincopylist.Sort(delegate(Object a, Object b) { return a.name.CompareTo(b.name); });

) NGUI的相关类关系:

)使得脚本能够在editor中实时反映:

在脚本前加上:[ExecuteInEditMode], 参考UISprite。

)隐藏相关属性

属性前加上 [HideInInspector],在shader中也适用;

比如:

[csharp] view plaincopypublic class ResourceLoad : MonoBehaviour { [HideInInspector] public string ressName = "Sphere"; public string baseUrl = " [csharp] view plaincopyShader "stalendp/imageShine" { Properties { [HideInInspector] _image ("image", 2D) = "white" {} _percent ("_percent", Range(-5, 5)) = 1 _angle("_angle", Range(0, 1)) = 0 }

)属性的序列化

可被序列化的属性,可以显示在Inspector面板上(可以使用HideInInspector来隐藏);public属性默认是可被序列化的,private默认是不可序列化的。使得private属性可被序列化,可以使用[SerializeField]来修饰。如下:

[csharp] view plaincopy[SerializeField] private string ressName = "Sphere";

)Shader编译的多样化(Making multiple shader program variants)

shader通常如下的写法:

)AngryBots中的showFPS代码:

Unity3d实现的十字路口的模拟(四) ok,我们已经知道我们的预制物体都是怎么个结构了,下面我们就来说一下,具体的随机创造车辆的函数,我是把这个脚本放到了我的地形这个物体上,

Unity3d实现的十字路口的模拟(五) 这一节我们来说一下红绿灯的控制和总结一下经验。红绿灯的模型,本来也是想要在网上下载结果找来半天没有找到相应的资源,于是就自己用3dmax做了

Unity3D 4.6.3之游戏物体的激活与暂停 在游戏开发时有时会将游戏物体激活或者暂停以达到预期效果,但是当临时用GameObject.Find(gameobject).setActive(false)暂停游戏物体后,若在其他地方再想通过

标签: unity操作教程

本文链接地址:https://www.jiuchutong.com/biancheng/380101.html 转载请保留说明!

上一篇:Unity3d实现的十字路口的模拟(二)(unity3d功能介绍)

下一篇:Unity3d实现的十字路口的模拟(四)(u3d unity3d)

  • 零税率是指
  • 利息收入纳税义务时点
  • 转账支付水电费属于什么会计科目
  • 豆制品属于农产品初加工吗
  • 职工的困难补助计入什么科目
  • 广告设计公司挣钱吗
  • 维修费收入怎么结转成本
  • 工厂开不了发票
  • 境外非居民企业所得税
  • 企业退回企业所得税分录
  • 国际船舶代理是什么意思
  • 记账凭证上的摘要每行都要写吗
  • 哪些企业可以享受加计抵减政策
  • 汇算清缴亏损在后期弥补时怎么做会计处理?
  • 贷款金融资产减值的会计分录怎么写?
  • 以前多计提了应付职工薪酬怎么平账?
  • 关停企业的生产线能否停止计提折旧?
  • 企业接收政府划入资产的税务处理办法
  • 公司纳税人是什么意思是不是法人
  • 固定资产报废处理流程图
  • 人力资源部报销购买办公家具款
  • 收到银行本票的会计分录怎么写
  • 年终股东利润分配方案
  • u盘加载缓慢
  • 利润总额和净利润的区别
  • 长期股权投资特征
  • php数据库分页是怎么实现的
  • PHP:ftp_nb_put()的用法_FTP函数
  • php中的require
  • 消防工程改造方案
  • 人工单位怎么写
  • 破产资产拍卖
  • 鸿蒙系统怎么退出开发者选项
  • php读取opc
  • neo什么意思翻译成中文
  • 增值税专用发票怎么开
  • 调整多计提企业利润
  • 怎么安装vue2.0
  • symfony框架经验总结
  • 背书转让的步骤
  • 论文导语如何写
  • 评价股权转让要交什么税
  • mongodb快速入门
  • 银行年费什么时候取消的
  • 差额征税要交多少钱
  • 销货清单要放凭证里吗
  • 无法取得发票的成本能列支吗
  • Mysql以utf8存储gbk输出的实现方法提供
  • 职工福利费的开支是什么
  • 装修行业小规模最高能开几个点的票
  • 月末忘记结转怎么办
  • 一个工程项目多个业主吗
  • 缴纳个人社保在哪里查询
  • 中央空调的维护费一年要多少钱?
  • 刚成立的公司没有五险一金
  • 从业人数和资产总额指标,应按企业
  • 商品流通企业有哪些企业
  • sql server如何判断数据库是否存在
  • mysql声明全局变量
  • sql查询包含特殊
  • mysql5.7.24安装配置教程
  • linux 添加ipv6路由
  • vmware10虚拟机安装
  • windows精简版精简了哪些
  • win10系统怎么设置开机密码
  • linux ./执行
  • 怎么从win8装回win7
  • linux内核和根文件系统的关系
  • win10系统自带浏览器在哪里
  • 事件委托机制的三个主要组件
  • 字符串拼接join
  • unity uma
  • js中改变css文件中的样式
  • 简单的智能家居
  • jqueryw3c
  • 怎么在手机开数据那里看用了多少流量
  • 各地市的税务局有哪些
  • 黄金消费税如何缴纳
  • 新疆税务干部学校招聘
  • 怎样在网上申报税务流程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设