首页 > 作文

Unity3d实现无限循环滚动背景

更新时间:2023-04-04 12:47:36 阅读: 评论:0

在游戏项目中我们常常看到商城的广告牌,几张广告图片循环滚动,类似跑马灯,现在我将讨论一种实现方法,并提供一个管理类,大家可以直接使用。

实现原理:背景图片循环滚动的原理很简单:两张图片向一个方向移动,当达某张图片到临界区域时将图片放在后面,依次循环。

在实际项目中,广告牌显示的图片数量不确定,例如某个假期活动会上很多新品,此时我们需要动态的创建显示的图片(一般在配置表读取数据),如果需要显示分类标签还得动态生成分类标签。

综上所述,一个完整的广告牌组件应该具有以下功能:

– 无限循环的滚动背景图片
– 根据读取的数据动态生成图片
– 具有分类标签,根据显示图片动态生成
– *做成一个管理类,方便使用(一个项目中可能多处会用到)

下面谈谈我的方法:

第一步:创建滚动组件advertimentscroll,这个组件挂在gameobject上面,接受传递过来的数据,生成显示的图片和分类标签,在update中实现无限循环滚动。

using system.collections.generic;using unityengine;namespace asts.scripts.client{  public class advertimentscroll : monobehaviour  {     private float _timer;    private bool _isstart;    private vector3 _togglecenter;    private int deldistance;    private int _currentpage; //当前页面      private advertimentscrollmanager.advertimentscrolldata _itemdata;       private list<toggledata> _togglelist = new list<toggledata>();        private vector3 _toleftposition;//向左滑动到某个位置    public class toggledata    {      public string name;      public gameobject go;    }    public advertimentscrol学生的妈妈lmanager.advertimentscrolldata itemdata    {      get { return _itemdata; }      t { _itemdata = value; }    }  public void startscroll(bool createtoggle)  {    if (!_isstart)    {      createadvertibg();      createadvertitoggle(createtoggle);      if (createtoggle)      {        if (itemdata.toggleitem != null)        {          itemdata.toggleitem.getcomponent<uitoggle>().value = true;        }               }             _currentpage = 1;      _isstart = true;    }      }  /// <summary>  /// 创建需要显示的图片(需要图片数量,图片精灵名称,图片的宽度,图片左边和右边的显示位置)  /// </summary>  private void createadvertibg()  {    _toleftposition = new vector3(itemdata.leftposition.x - itemdata.spritewidth, itemdata.leftposition.y, itemdata.leftposition.z);    for (int i = 0; i < itemdata.maxpage; i++)    {      gameobject firstspriteitem;      gameobject condspriteitem;      if (女生向前翻i == 0)      {        firstspriteitem = condspriteitem = itemdata.spriteitem.gameobject;      }      el      {        firstspriteitem = itemdata.firstmovego.gameobject.addchild(itemdata.spriteitem.gameobject);        firstspriteitem.tactive(fal);        condspriteitem = itemdata.condmovego.gameobject.addchild(itemdata.spriteitem.gameobject);        condspriteitem.tactive(fal);      }      firstspriteitem.transform.localposition = condspriteitem.transform.localposition = vector3.zero;      firstspriteitem.name = condspriteitem.name = (i + 1).tostring();      firstspriteitem.getcomponent<uisprite>().spritename = condspriteitem.getcomponent<uisprite>().spritename = itemdata.spritename[i];    }  }  /// <summary>  /// 创建分页图片,默认不创建(需要分页图片,分页的中间位置,每个分页的间隔)  /// </summary>  /// <param name="create"></param>  private void createadvertitoggle(bool create = fal)  {    if (create)    {      _togglecenter = itemdata.togglecenterpos;      deldistance = itemdata.toggledistance;         vector3 firstpoint = _togglecenter - new vector3((itemdata.maxpage / 2f - 0.5f) * deldistance, 0f, 0f);      for (int i = 0; i < itemdata.maxpage; i++英语四级考试成绩)      {        gameobject item;        toggledata toggledata = new toggledata();        if (i == 0)        {          item = itemdata.toggleitem.gameobject;        }        el        {          item = itemdata.togglecontainer.gameobject.addchild(itemdata.toggleitem.gameobject);        }        item.transform.localposition = firstpoint + new vector3(i*deldistance, 0f, 0f);        item.name = "toggle" + i;        toggledata.go = item;        toggledata.name = item.name;        _togglelist.add(toggledata);      }    }  }  void update()  {    if (!_isstart)    {      return;           }    if (time.framecount % (30 * itemdata.movetime) == 0 && itemdata.maxpage > 1)    {      if (itemdata.firstmovego.localposition.x < itemdata.leftposition.x - 0.5)      {        itemdata.firstmovego.localposition = itemdata.rightposition;      }      if (itemdata.condmovego.localposition.x < itemdata.leftposition.x - 0.5)      {        itemdata.condmovego.localposition = itemdata.rightposition;      }      transform lefttran = itemdata.firstmovego.localposition.x < itemdata.condmovego.localposition.x ? itemdata.firstmovego : itemdata.condmovego;      transform righttran = itemdata.firstmovego.localposition.x < itemdata.condmovego.localposition.x ? itemdata.condmovego : itemdata.firstmovego;      tweenposition.begin(righttran.gameobject, 0.5f, itemdata.leftposition, fal);      tweenposition.begin(lefttran.gameobject, 0.5f, _toleftposition, fal);      _currentpage = fixpage(_currentpage);      tpic(righttran, _currentpage);      //tbtn(lefttran,fal);      //tbtn(righttran,true);             _togglelist[_currentpage - 1].go.getcomponent<uitoggle>().value = true;    }  }  private void tbtn(transform tran, bool state)  {    transform tf = tran.find("icon");    if (tf != null)    {      tf.gameobject.tactive(state);    }       }  private void tpic(transform tran, int _currentpage)  {    foreach (transform t in tran)    {      if (t.name == _currentpage.tostring())      {        t.gameobject.tactive(true);      }      el      {        t.gameobject.tactive(fal);      }    }  }  private int fixpage(int page)  {    page++;    if (page > itemdata.maxpage)    {      page = 1;    }    return page;  }}  }

第二步:创建管理类advertimentscrollmanager,将它做成一个单例,调用advertimentscroll的方法,开始滚动。

using unityengine;using system.collections.generic;namespace asts.scripts.client{public class advertimentscrollmanager : singleton<advertimentscrollmanager>{   public struct advertimentscrolldata  {    public bool iscreatetoggle;    //是否创建分页标签    public transform toggleitem;   //分页标签    public transform togglecontainer; //分页标签所在的panel    public vector3 togglecenterpos;  //分页标签的中间位置    public int toggledistance;    //分页标签之间的间隔    public transform firstmovego;   //移动的物体    public transform condmovego;  //移动的物体    public vector3 leftposition;   //移动物体的左边位置    public vector3 rightposition;   //移动物体的右边位置    public transform spriteitem;   //显示的图片    public int spritewidth;      //图片的宽度    public string[] spritename;    //显示的所有图片在图集中的名称    public int maxpage;        //最大的页面    public int movetime;       //每隔多少秒移动一次  };  public void startadvertimentscroll(transform parenttf, advertimentscrolldata data,bool createtoggle = fal)  {    if (parenttf != null)    {      uipanel panel = parenttf.getcomponent<uipanel>();      if (panel == null)      {        return;      }      advertimentscroll scroll = null;      transform tf = parenttf.find("advertimentscroll");      if (tf == null)      {        gameobject go = new gameobject();        go.name = "advertimentscroll";        go.transform.parent = parenttf;        go.transform.localposition = vector3.zero;        go.transform.localsca乞力马扎罗山的雪le = new vector3(1, 1, 1);        //go.layer = layermodel.uilayer;        tf = go.transform;        scroll = tf.gameobject.addcomponent<advertimentscroll>();               }      el      {        scroll = tf.gameobject.getcomponent<advertimentscroll>();      }      scroll.itemdata = data;      scroll.itemdata.firstmovego.parent = tf;      scroll.itemdata.condmovego.parent = tf;      scroll.startscroll(createtoggle);    }  }}}

第三步:使用。预制体的制作方法就不说了,代码看懂了自然好弄,后面也会附上工程文件。你在任何一个界面需要使用广告牌组件时只需要先设置好数据,然后调用advertimentscrollmanager中的startadvertimentscroll方法就可以了。

using asts.scripts.client;using unityengine;namespace asts{public class advertiscrollsample : monobehaviour{  private transform _firstmovego;  private transform _condmovego;  private transform _container;  private transform _togglecontainer;  private transform _spriteitem;  private transform _toggleitem;     void start ()  {    _firstmovego = transform.find("panel/container/first");    _condmovego = transform.find("panel/container/cond");    _container = transform.find("panel/container");    _togglecontainer = transform.find("panel/togglecontainer");    _spriteitem = transform.find("panel/container/first/item");    _toggleitem = transform.find("panel/togglecontainer/toggleitem");    onrefreshdata();  }  void onrefreshdata()  {    advertimentscrollmanager.advertimentscrolldata data = createadvertimentscrolldata();    advertimentscrollman养胃药ager.instance.startadvertimentscroll(_container,data,data.togglecontainer);  }  private advertimentscrollmanager.advertimentscrolldata createadvertimentscrolldata()  {    advertimentscrollmanager.advertimentscrolldata data = new advertimentscrollmanager.advertimentscrolldata();    //设置显示图片的数量和滑动的时间间隔    data.movetime = 10;    data.maxpage = 3;    //设置图片的位置信息    data.firstmovego = _firstmovego;    data.condmovego = _condmovego;    data.spriteitem = _spriteitem;    data.spritewidth = 884;    data.spritename = new string[] { "1", "2", "3" };    data.leftposition = vector3.zero;    data.rightposition = new vector3(800, 0, 0);    //设置分页标签信息(如果不需要分页标签,可以不用赋值)    data.iscreatetoggle = true;    data.toggleitem = _toggleitem;    data.togglecontainer = _togglecontainer;     data.togglecenterpos = new vector3(0,-200,0);    data.toggledistance = 30;                   return data;  }}}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。

本文发布于:2023-04-04 12:47:34,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/80ee31502891c8a8a688f202a00307f9.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Unity3d实现无限循环滚动背景.doc

本文 PDF 下载地址:Unity3d实现无限循环滚动背景.pdf

标签:图片   分页   标签   位置
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图