NGUI动画/UI解决刷新显示错误的问题

21 篇文章 6 订阅
2 篇文章 0 订阅
1.Tween系列组件,播放方式style为once,但是如果在代码中多次调用的,会出现不播放的情况。
解决:每次调用PlayForword()之前要加一行:tweenScale.ResetBeginning();
 
2.Animation动画制作一个按圆圈轨迹移动的动画:
默认显示DopeSheet窗口,修改节点的属性,选择Curves可以看动画曲线,我是编辑完才发现,有规律的动画,这个曲线也是有一定规律的。直接用曲线编辑可能更加方便。修改Position属性,.x曲线是余弦曲线,Y是正旋弦曲线。Z轴保持0值不变,当然如果绕空间旋转,可能Z也要跟着改变。
编辑的结果示意图为余弦曲线,画的太丑了:
圆轨迹动画曲线.bmp

3. 不确定是Unity还是NGUI的关系。总会遇到ScrollView下的子界面排序(重新定位)。
    (1)在刚打开界面(Set.Active(true))就立即排序很容易出现无效的情况。这个是Unity的一个刷新问题,说多了都都是泪。如果出现了这样的情况,最好active=true之后短暂延时(如0.01s)。这样就不容易出现子节点指定位置不生效的情况了。
NGUI中实现一个子节点排序列表的ScrollView的几种方法,如图中结构:
  UI界面.bmp

    (2)此外,如果出现频繁执行UIScrollView.Resetpotiion()发现各种显示异常,对!仅仅是显示异常,对象坐标参数什么的全都OK的情况下,只要后面多加两行:
UIScrollView.SetActive(false);
UIScrollView.SetActive(true);
连着先隐藏后立即显示UIScrollView就木有问题了。

2016年7月18日补充:
对于刚初始化或显示出来的UI对象不管是子节点中,不管是NGUI的 UIScrollView子节点刷新,还是UGUI中的ScrollRect节点下的刷新也好,刚刚初始化万组件立即去做别的事情常常容易出现异常,除了上面的解决办法外,还可以尝试做一些延迟,比如在下一帧。或当前帧刷新的结尾,即可以用到协程啦!
<pre name="code" class="csharp">using UnityEngine;
using System.Collections;

public class DelayDealDemo : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {
        //先初始化资源

        //延迟刷新
        StartCoroutine(DelayDeal());
    }

    private IEnumerator DelayDeal()
    {
        yield return new WaitForEndOfFrame();

        //TODO延迟后操作
    }
}
    (3).利用UIGrid.sort=true,子节点依次按字典序命名达到自动排序的效果。注意:这种方法不提倡!非常不稳定!如一堆节点按1,2,3,4...命名。很容易出现最终乱序的结果;
    (4).直接改变子节点的localPosition。需要注意:这时各个子节点必须同名,且grid.sorted=false.最好不要调用grid.Respositin(),scrollView.ResetPosition()这种低效又不稳定的函数,子节点一多,很容易就测出来这些函数比直接修改localPosition慢啊!

    (5).想要使UIGrid达到预定的排序效果,item数字前补充"0",001,002,003...这样下来



5.获得所有直接的孩子节点,通过两个函数,transform.childCount和transform.GetChild(i)来实现 :下面的接口可以获得father对象的所有直接孩子节点:
public List<Transfrom> GetChilds(Transform father)
{
    List<Transfrom> childList = new List<Transform>();
    for(int index=0;index <father.childCount;index++)
    {
        Transform child = father.GetChild(index);
        //把child保存起来可以获得孩子数组
        childList.Add(child);
    } 
    return childList;
}
而在此前,我们一直默认获取所有直接孩子节点的方式是什么?通过默认foreach来遍历,不得不说用的频繁了很郁闷。知道了GetChilds方法还是尽量少用foreach吧。
foreach(Transform child in Transform father)
{
      //干什么干什么
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值