• 在诸如天天跑酷等2D游戏中,由于游戏需要表现出运动的感觉,通常都会使游戏背景连续循环滚动以增强视觉效果,那么今天,博主就来带领大家一起来实现连续滚动背景吧!  首先来讲述一下原理,准备两张连续的图片(博主...

             大家好,欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei。

            在诸如天天跑酷等2D游戏中,由于游戏需要表现出运动的感觉,通常都会使游戏背景连续循环滚动以增强视觉效果,那么今天,博主就来带领大家一起来实现连续滚动背景吧!

             首先来讲述一下原理,准备两张连续的图片(博主这里使用了一张图片,好吧,我偷懒了),我们使用正交投影的摄像机对准第一张背景,然后使用脚本让图片自右向左开始移动,当第一张图片移出摄像机的视野时,第二张图片立即接在第一张图的后面,继续向左移动,而当第二张图片移出摄像机视野时,第一张图片会立即接在第二张图片的后面,如此周而复始,就实现了连续滚动背景。好了,下面,我们一起开始,首先我们创建一个空的项目,我们需要加入一个Plane并将其命名为Bg0、一个 平行光源。参数设置如下图:


           接下来,我们 将 实现准备好的背景图片拖放到Bg0上,然后调整摄像机的视野大小,使第一张图片恰好位于其视野中,然后我们将Bg0复制出一个副本并命名为Bg1,调整其位置,使其接在第一张图片的后面,此时,场景效果如下图:

          

             好了,接下来,我们开始编写脚本,代码十分简单:

    using UnityEngine;
    using System.Collections;
    
    public class BGControll : MonoBehaviour {
    	
    	//Move Speed;
    	private float mSpeed=3.0F;
    	void Start () 
    	{
    	
    	}
    	
    	
    	void Update () 
    	{
    	   //Translate form right to left
    	   transform.Translate(Vector3.right * Time.deltaTime * mSpeed);
    	   // If first background is out of camera view,then show sencond background
    	   if(transform.position.x<=-11.8F)
    	   {
    		  //We can chenge this value to reduce the wdith between 2 background
    		  transform.position=new Vector3(11.8F,transform.position.y,transform.position.z);
    	   }
    	}
    }
    

               我觉得大家对代码应该不会有什么疑问吧,唯一的疑问可能来自于-11.8,这个值是第一张图片离开摄像机视野的临界值,这个值怎么得到呢,大家可以将游戏视图改为标准视图,然后用鼠标拖动第一个背景图片来获取,这里就不再多说了,最后来看下游戏运行效果吧。


           以后的效果演示都会采用动画演示,希望大家喜欢,谢谢!

           补充内容:经过博主自己研究,如果在画面滚动的时候出现缝隙,这是由于两个画面在运动过程中相互碰撞导致的,所以我们只需要将其碰撞器勾选isTrigger取消碰撞即可,谢谢大家关注我的博客,我是秦元培,我的博客是blog.csdn.net/qinyuanpei



    展开全文
  • Unity3D游戏机循环滚动效果,效果查看点这里:https://blog.csdn.net/qq_36102944/article/details/89047472
  • Unity 3D循环滚动效果

    2017-07-25 14:50:36
    然后通过SetDepthAndPosition这个方法,实现图片的空间空间展开Z轴和Y轴,系数是一样的经过上面设置,空间就摆开了using UnityEngine; using System.Collections; using System.Collections.Generic;public class ...

    这里写图片描述


    然后通过SetDepthAndPosition这个方法,实现图片的空间空间展开


    这里写图片描述



    这里写图片描述


    Z轴和Y轴,系数是一样的


    经过上面设置,空间就摆开了


    这里写图片描述



    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    
    public class SelectRole : MonoBehaviour {
        public GameObject rolesObj;
        private int _half = 0;//一侧的卡片数
        private int _movX = 150;//X轴移动距离
        private int _movY = 50;//Y轴移动距离
        private int _movZ = 60;//Z轴移动距离
        private int count = 3;//组件数
        private List<RoleItem> _roleList = new List<RoleItem>();
    
        // Use this for initialization
        void Start () {
            //加载图片
            Object[] textureList = (Object[])Resources.LoadAll("Pictures");
    
            int maxDepth = textureList.Length % 2 == 1 ? textureList.Length / 2 + 1 : textureList.Length / 2;//最大深度
            _half = maxDepth;      
    
            for (int i = 0; i < textureList.Length; i++)
            {            
                //加载角色图片预设
                GameObject role = Instantiate(Resources.Load("Role", typeof(GameObject))) as GameObject;            
                role.transform.parent = rolesObj.transform;
                role.transform.localScale = Vector3.one;
    
                EventDelegate.Add(role.GetComponent<UIToggle>().onChange , RoleToggleChange);
    
                RoleItem item = role.GetComponent<RoleItem>();            
                item.texture.mainTexture = textureList[i] as Texture;
    
                //设置角色卡片排序命名
                role.name = maxDepth.ToString();
                if (i > 0)
                {
                    //奇数设置为右边,下标为正数
                    if (i % 2 == 1)
                    {
                        maxDepth--;
                        role.name = maxDepth.ToString();
                    }
                    //偶数设置为左边,下标为负数
                    else
                    {
                        role.name = "-" + maxDepth.ToString();
                    }
                }
    
                SetDepthAndPosition(item,0,0);
                _roleList.Add(item);
            }        
        }
    
    
        private void SetDepthAndPosition(RoleItem role,int dir,int index)
        {
            int indexDepth = 0;
            //左右移动后,重新排序命名
            if (dir != 0)
            {
                if (index*dir > _half )
                    indexDepth = -dir * (_half - 1);
                else
                    indexDepth = index > -1 && index < 1 ? dir : index;
                role.name = indexDepth.ToString();  
            }        
            else
            {
                indexDepth = int.Parse(role.name);
            }
    
            TweenPosition tp = role.GetComponent<TweenPosition>();
            int x = indexDepth < 0 ? -(_half + indexDepth) * _movX : (_half - indexDepth) * _movX;
            indexDepth = System.Math.Abs(indexDepth);
            tp.to = new Vector3(x, (_half - indexDepth) * _movY, (_half - indexDepth) * _movZ);
    
    
            role.bg.depth = count * indexDepth;
            role.active.depth = 1 + count * indexDepth;
            role.texture.depth = 2 + count * indexDepth;      
    
            role.GetComponent<UIToggle>().value = indexDepth == _half ? true:false;
            tp.PlayForward();
        }
    
        /// <summary>
        /// 左边
        /// </summary>
        public void LeftClick()
        {
            //重新排列顺序
            foreach (RoleItem role in _roleList)
            {
                int index = int.Parse(role.name);
                print(index);
                SetDepthAndPosition(role,1,++index);
            } 
        }
    
        /// <summary>
        /// 右边
        /// </summary>
        public void RightClick()
        {
            //重新排列顺序
            foreach (RoleItem role in _roleList)
            {
                int index = int.Parse(role.name);
                SetDepthAndPosition(role,-1,--index);
            }
        }
    
        /// <summary>
        /// 鼠标选中某个角色
        /// </summary>
        public void RoleToggleChange()
        { 
            if(UIToggle.current.value)
            {
                int index = int.Parse(UIToggle.current.name);
                int moveCount = _half - System.Math.Abs(index);//移动个数
                for (int i = 0; i < moveCount;i++ )
                {
                    if (index > 0)
                        LeftClick();
                    else
                        RightClick();
                }           
            }
        }
    
    }



    FR:海涛高软(hunk Xu)

    展开全文
  • 最近用unity4.3做个2d平台游戏,背景循环的问题搞得我头大了,如果用锚点连接图片有点小题大做,于是发现了下边这篇文章. 建议大家看文章中提到的这个例子插件androidgameexample,下载地址:泽国论坛(这个论坛好棒呀,...

    最近用unity4.3做个2d平台游戏,背景循环的问题搞得我头大了,如果用锚点连接图片有点小题大做,于是发现了下边这篇文章.

    建议大家看文章中提到的这个例子插件android game example ,下载地址:泽国论坛(这个论坛好棒呀,下载免费,不像大多数论坛那样动不动积分,权限,收费之类的)http://www.zeguoren.com/forum.php?mod=viewthread&tid=6028

    真是抱歉,从今天起才认真的翻阅android game example 这个插件,开始熟悉一下外国佬的一些编程方式,相信很多人没有看过我就当做一个记录吧,都是一些简单的小东西。

    首先就是这个滚动的背景图,也许叫“跑马灯”会比较好理解。

    来看看效果:

    看起来这博客系统还不那么差,至少可以播放gif。

     

    这种滚动背景很容易让我想到的就是,跑酷类游戏,空战游戏,总之类似的横版游戏,当然了现在的游戏设计都变得很精致了,相信这样级别的背景还不能满足吧~

     

    这个例子我们不借助任何第三方的精灵插件,都用原始的控件来,我们需要准备的就是一个cube,当然plane也可以。

     

    现在新建一个场景,准备一个正交相机,一个plane,一个灯光,一个material,一张图片,现在调整好位置当该就变成了这样:

     

     

    好吧现在我们让background上的贴图滚动(事实上这就1分钟的事儿,打成字居然这么麻烦,真是是该考虑制作视屏了),注意到这个了么:

     

    试着变化一下offset的x的值,哇~图片变化了,好吧其实没有什么神奇的~

    接着我们就让它自动变化便是了 

    加上我们的滚动脚本:

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    using UnityEngine;
    using System.Collections;
             
    public class ScrollingByOffset : MonoBehaviour
    {
        /// <summary>
        /// 滚动速度
        /// </summary>
        public float _Speed;
        /// <summary>
        /// 滚动的材质载体
        /// </summary>
        private Material _ScrollMaterial;
             
        void Start()
        {
            this._ScrollMaterial = renderer.material;
        }
             
        void Update()
        {
            this._ScrollMaterial.mainTextureOffset = new Vector2(_Speed * Time.time, 0);
        }
    }

     

    跑起来瞅瞅,似乎还不错。

    接着调整一下灯光,图片的大小(图片最好大到超出相机的视野,效果会好很多)。

     

    接着我把资源和代码贴上来,各位有兴趣可以试试。

    转载于:https://www.cnblogs.com/TouchAfflatus/articles/3536667.html

    展开全文
  • 首先就是这个滚动的背景图,也许叫“跑马灯”会比较好理解。 来看看效果: 看起来这博客系统还不那么差,至少可以播放gif。 这种滚动背景很容易让我想到的就是,跑酷类游戏,空战游戏,总之类似的

    链接:http://momowing.diandian.com/post/2013-01-26/40049505995

    真是抱歉,从今天起才认真的翻阅android game example 这个插件,开始熟悉一下外国佬的一些编程方式,相信很多人没有看过我就当做一个记录吧,都是一些简单的小东西。

    首先就是这个滚动的背景图,也许叫“跑马灯”会比较好理解。

    来看看效果:


    看起来这博客系统还不那么差,至少可以播放gif。

    这种滚动背景很容易让我想到的就是,跑酷类游戏,空战游戏,总之类似的横版游戏,当然了现在的游戏设计都变得很精致了,相信这样级别的背景还不能满足吧~

    这个例子我们不借助任何第三方的精灵插件,都用原始的控件来,我们需要准备的就是一个cube,当然plane也可以。

    现在新建一个场景,准备一个正交相机,一个plane,一个灯光,一个material,一张图片,现在调整好位置当该就变成了这样:



    好吧现在我们让background上的贴图滚动(事实上这就1分钟的事儿,打成字居然这么麻烦,真是是该考虑制作视屏了),注意到这个了么:


    试着变化一下offset的x的值,哇~图片变化了,好吧其实没有什么神奇的~

    接着我们就让它自动变化便是了

    加上我们的滚动脚本:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    using UnityEngine;
    using System.Collections;
           
    public class ScrollingByOffset : MonoBehaviour
    {
        /// <summary>
        /// 滚动速度
        /// </summary>
        public float _Speed;
        /// <summary>
        /// 滚动的材质载体
        /// </summary>
        private Material _ScrollMaterial;
           
        void Start()
        {
            this._ScrollMaterial = renderer.material;
        }
           
        void Update()
        {
            this._ScrollMaterial.mainTextureOffset = new Vector2(_Speed * Time.time, 0);
        }
    }

    跑起来瞅瞅,似乎还不错。

    接着调整一下灯光,图片的大小(图片最好大到超出相机的视野,效果会好很多)。

    接着我把资源和代码贴上来,各位有兴趣可以试试。

    http://www.kuaipan.cn/file/id_12421281643248523.htm

    展开全文
  • 用Canvas创建了两张Image拼接作为背景。 using System.Collections; using System.Collections.Generic; using UnityEngine; public class MOVE : MonoBehaviour { public Transform bg1;... ...

    用Canvas创建了两张Image拼接作为背景。
    脚本挂在摄像机上
    把两张image拖到MOVE(Script)设置为bg1、bg2

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class MOVE : MonoBehaviour {
    
        public Transform bg1;
        public Transform bg2;
        //也可以用GameObject ; 具体区别 自己查
    
        float bg1PosX;//bg1初始位置X轴的值
        float bg2PosX;//bg2初始位置X轴的值
        //在Start方法之前的函数、
        //即使脚本没有被激活也会执行且只运行一次
    
        // Use this for initialization
        //在整个脚本生命周期中只被调用一次
        //它是在第一次执行Update函数之前调用
        //用于做数值的初始化设置
        void Start () {
            //bg2 = transform.Find("Img_BG2");
            //其实可以用代码调用图片的。
            bg1PosX = bg1.transform.position.x;
            bg2PosX = bg2.transform.position.x;
        }
    
        // Update is called once per frame
        //每帧调用一次,每一次循环间隔在0.01-0.025秒之间(电脑越好循环的间隔越短)
        //循环的基础函数(在初始化函数结束后开始循环函数)
        void Update () {
            bg1.Translate(Vector3.left * Time.deltaTime * Screen.width);
            bg2.Translate(Vector3.left * Time.deltaTime * Screen.width);
            if (bg2.transform.position.x - bg1PosX < 0)
            {
                bg1.position += new Vector3(bg2PosX -bg1PosX,0,0);
                bg2.position += new Vector3(bg2PosX - bg1PosX, 0, 0);
            }
        }
    }
    

    以2D对象Sprite 创建背景图片
    把脚本拖到两个Sprite 对象上即可。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class bird : MonoBehaviour {
        float speed = 0.01f;
    
        // Use this for initialization
        void Start () {
            print(transform.position);
        }
    
        // Update is called once per frame
        void Update () {
            transform.Translate(Vector3.left * Time.deltaTime*Screen.width);
            if (transform.position.x <-6.33f) {
                transform.position = new Vector3(6.27f, transform.position.y, transform.position.z);
            }
        }
    }
    
    展开全文
  • 需求 呈现3D效果(2D素材)选择角色效果 滚动保证层级,缩放比例,间距正常跟随 循环滚动 这个界面需求一般也会有游戏会采用(貌似有挺多) 如何实现 ...说到实现的核心,需要知道Unity3D中提供的一个叫
  • Unity3D 制作游戏机循环滚动效果 最近需要在unity中制作一个2D的游戏滚动效果,全网百度了几遍也没有找到什么资料,于是现在我弄了一个出来分享给大家。我把模板做成了预制体,大家可以直接拿去使用然后解除与预制体...
  • Unity3D 无限滚动列表

    2019-01-09 14:48:28
    在游戏开发的过程中,会经常用到无限滚动列表做一些界面的展示,像排行榜,房间列表,好友列表,装备列表等等,GitHub有个非常好用的无限滚动列表,这个滚动列表是基于UGUI的,所以需要创建一个UGUI的ScrollRect,再...
  • 添加背景图片,当然也可以把背景资源放到空物体里。然后复制出来一份; 然后将两份背景资源拖到一个空物体里 添加脚本 说明:首先获取两个背景的位置分别存储。移动过程中,当后一个背景的X超过前一个背景开始存储...
  • Unity_实现背景循环滚动 1.创建一个工程,命名为roll 2.向场景中添加一个立方体(右键-&gt;3D Object-&gt;Cube),命名为Background。并把它置于(0,0,0)处,把立方体缩放为(15,15,0.1) 3.在...
  • 1 导入一张图片,设置格式如下 2 创建一个shader文件,对应的shader代码如下 Shader "Unlit/ScrollX" { Properties { _MainTex("Base Layer(RGB)", 2D) = "white" {} // 纹理 _ScrollX("Base layer Scroll...
  • 下面展示如何用Unity3D做出如下连续滚动的背景的效果。让人看起来那个Capsule是在不停地跑动的样子。 一、场景布置 1、在画图准备一张这样的图片,自己随便画都能画出来了,简笔画: 2、在Unity3D中的布
  • 参考链接 : https://blog.csdn.net/dengshunhao/article/details/82657585(包含效果图) UGUI实现闹钟选择,数字上下循环滚动(当然也可以换成其他UI,比如图片)
  • 分享一个编写的一个EnhanceScollView选择角色3D循环滚动效果 (还是圣殿发帖子样式舒服,代码添加,图片,高亮,赞一个~) 演示和下载地址请到文章最后查看 需求 呈现3D效果(2D素材)选择角色效果滚动保证...
  • unity3d 滚动字幕

    2014-07-29 19:44:23
    Unity3d局部显示滚动字幕 1. 在场景中新建一个camera和一个3d text,如图所示:    2. 在3d text的layer层新建text层   3. 设置camera的clear flags为depth only,culling mask为text,Projection为...
  • 下载地址:http://pan.baidu.com/s/1mgD2VH2  密码u35x
  • 当ScrollView下的物体很多上百上千的时候,不可能去实例化出来这么多物体,这个时候需要优化了,不然drawcall会很大很大 ,所以笔者花了1,2天时间去写了一个比较实用的工具,那就是ScrollView无限循环滚动,接下来...
  • 背景无限循环滚动效果如下示: 步骤如下: 导入背景图片后,设置图片的格式,如下图; 2.图片格式也可以设置是Texture格式,但是Wrap Mode 一定要是Repeat[重复发生];然后记得Apply一下。[解释:Wrap ...
1 2 3 4 5 ... 20
收藏数 573
精华内容 229