1、使某个对象上的脚本失效和生效:
GameObject.Find("xxx").transform.GetComponent<xxx>().enabled = false; //失效 GameObject.Find("xxx").transform.GetComponent<xxx>().enabled = true; //失效
2、NGUI相机震动效果:
public float _shake_time = 0.5f; public void CameraShake() { iTween.ShakePosition(GameObject.Find("UI Root/Camera").camera.gameObject, new Vector3(0.05f, 0.05f, 0), this._shake_time); }
3、NGUI中播放某个对象下的Tween动画:
TweenPosition[] tween = null; TweenPosition tw = null; // 获取对象下全部TweenPosition组件 tween = this._show_panel.GetComponents<TweenPosition>(); for (int i = 0; i < tween.Length; i++) { tw = tween[i]; // 选择要播放的Tween动画组 if (tw.tweenGroup == 1) { // 重置函数,不重置有可能出现第二次播放错误的情况 tw.ResetToBeginning(); tw.Play(); } }
4、获取某个父对象中的组件:
gameObject.transform.GetComponentInParent<InfoPanelManager>()
5、获取某个子对象组件:
gameObject.transform.GetComponentInChildren<PanelFade>()
6、Scroll View中按钮中的按钮点击失效:
问题描述:
用NGUI制作Scroll View时,Scroll View中的每一项为一个按钮,每一项还有多个按钮用于弹出不同的界面,初始时子按钮的Depth比父按钮的Depth高。这是把该界面作为预设用于在场景中点击某个对象时动态添加,会出现只能响应父按钮的点击事件,而子按钮的点击事件全部被屏蔽掉了。
解决方案:
将子按钮的Box Collider组件的size项的Z值设为比父按钮的大,NGUI按钮默认Z为0,即调为0.1即可。
注:
修改Box Collider组件的size项的Z值时,应该不勾选UISprite组件的Collider auto-adjust to match才能使修改生效
7、延迟等待执行代码方法:
这里用StartCoroutine开启协同程序的方法来实现。
StartCoroutine(WaitForShow(time)); IEnumerator WaitForShow(float time) { yield return new WaitForSeconds(time); }
值得注意的是如果这段程序需要运行一段较长时间,在运行期间,如果开启这段协同程序的组件被删除了,则这段程序就不在执行了,因此使用StartCoroutine要注意源组件的生命周期和协同程序的生命周期。
8、NGUI中所有panel都有一个Depth值,会影响所有它包含的widget。如果你的UI有很多窗口,那么最好每个窗口有一个panel。Panel上的depth权重会远远高于每一个widget的depth权重,所以保证panel不要使用同样的depth。如果使用同样的depth在panel上,那么draw call会被自动拆分来保证渲染顺序,所以会增加更多的draw call。
9、代码添加Tween组件动画播放完后执行某个函数:
参考链接:http://unity3d.9tech.cn/news/2013/1114/38624.html
EventDelegate.Add(this._fade_in_tween.onFinished, DestoryFadeInTween); void DestoryFadeInTween() { }
10、NGUI制作一个Panel时,每在Panel下添加一个子对象,如Label或者Sprite,后加的子对象Depth默认会加1,这样的话会导致当前Panel的Draw Call增加,应该是只要不互相重叠的子对象尽量用同一个Depth值。
11、Physics.RaycastAll 和Physics.Raycast 中的只选定Layermask参数,该参数表示值响应该层内的碰撞器,其它层内碰撞器忽略。Layermask的值应该等于2的n次方,这个n是layer面板上的值。