易于复用
使用简单
效果还不错
自动添加背景图层
自动移动背景图层位置
立体感更强,游戏效果更好



代码挂在新建空对象BackGroundController上,子物体放背景图,需要自己设置背景图的层级

using System.Collections.Generic;
using System.Linq;
using UnityEngine;public class BackGroundFollow : MonoBehaviour
{//需要添加的背景图,List<SpriteRenderer> CurrentSpriteRenderers = new List<SpriteRenderer>();//控制移动的对象List<Transform> Parents = new List<Transform>();//图片的宽float spriteOffsetX = 35.74f;  //图片与图片之间的偏移,也就是一张背景图的宽度//主相机Camera cam;//屏幕宽对应2D世界中的长度float CameraWightTranslate2Dlength;//上一针相机的位置Vector3 cameraLastPos;private void Awake(){cam = Camera.main;//计算相机宽度CameraWightTranslate2Dlength = GetCameraWightTranslate2Dlength();CreateBackgroundAndParents();//获取图片的宽BoxCollider2D tmp = CurrentSpriteRenderers[0].gameObject.AddComponent< BoxCollider2D > ();spriteOffsetX = tmp.size.x;Destroy (tmp);}private void Start(){cameraLastPos = cam.transform.position;}private void Update(){Follow();//记录相机位置cameraLastPos = cam.transform.position;}private void Follow(){bool isRight = false;//判断相机左移还是右移if (cameraLastPos.x < cam.transform.position.x){isRight = true;}else if (cameraLastPos.x > cam.transform.position.x){isRight = false;}else{//相机无移动return;}for (int i = 0; i < CurrentSpriteRenderers.Count; i++){Transform trans = CurrentSpriteRenderers[i].transform;//当前图片的左边界float spriteLeft = -spriteOffsetX / 2f + trans.position.x;float cameraLeft = cam.transform.position.x - CameraWightTranslate2Dlength / 2f;//当前图片的右边界float spriteRight = spriteOffsetX / 2f + CurrentSpriteRenderers[i].transform.position.x;float cameraRight = cam.transform.position.x + CameraWightTranslate2Dlength / 2f;//判断新的背景图片生成的位置if (isRight){if (spriteRight - cameraRight < 3f){//移动另一张图片for (int z = 0; z < trans.parent.childCount; z++){if (trans.parent.GetChild(z) != trans){trans.parent.GetChild(z).position = trans.position + new Vector3(spriteOffsetX, 0, 0);}}}if (spriteRight - cameraRight < -3f){//替换列表元素for (int z = 0; z < trans.parent.childCount; z++){if (trans.parent.GetChild(z) != trans){CurrentSpriteRenderers[i] = trans.parent.GetChild(z).GetComponent<SpriteRenderer>();}}}}else{if (Mathf.Abs(spriteLeft - cameraLeft) < 3f){//移动另一张图片for (int z = 0; z < trans.parent.childCount; z++){if (trans.parent.GetChild(z) != trans){trans.parent.GetChild(z).position = trans.position - new Vector3(spriteOffsetX, 0, 0);}}}if (cameraLeft - spriteLeft < -3f){//替换列表元素for (int z = 0; z < trans.parent.childCount; z++){if (trans.parent.GetChild(z) != trans){CurrentSpriteRenderers[i] = trans.parent.GetChild(z).GetComponent<SpriteRenderer>();}}}}//相机的移动量Vector3 cameraMove = cam.transform.position - cameraLastPos;//背景图层的移动//越远的图层移动越慢,反之则越快Parents[i].transform.position += cameraMove * 1f / (float)(Parents.Count + 1 - i);}}public void CreateBackgroundAndParents(){//获取所有spriteCurrentSpriteRenderers = transform.GetComponentsInChildren<SpriteRenderer>().ToList();//根据图层排序      //由大到小CurrentSpriteRenderers.Sort((x, y) => -x.sortingOrder.CompareTo(y.sortingOrder));//把相同层级的背景移动到对应的父物体上,方便统一移动同一层级下的背景for (int i = 0; i < CurrentSpriteRenderers.Count; i++){//新的父对象GameObject groundParent = new GameObject("层级_" + CurrentSpriteRenderers[i].sortingOrder);groundParent.transform.parent = transform;//同层 加入一个父对象中CurrentSpriteRenderers[i].transform.parent = groundParent.transform;SpriteRenderer spr = Instantiate(CurrentSpriteRenderers[i], groundParent.transform);spr.transform.position = CurrentSpriteRenderers[i].transform.position;spr.name = CurrentSpriteRenderers[i].name;Parents.Add(groundParent.transform);}}private float GetCameraWightTranslate2Dlength(){Vector3 cornerPos = Camera.main.ViewportToWorldPoint(new Vector3(1, 0));Vector3 cornerPos0 = Camera.main.ViewportToWorldPoint(new Vector3(0, 0));//计算相机宽度return cornerPos.x - cornerPos0.x;}}

unity 2D平台跳跃游戏背景相对移动相关推荐

  1. asset文件夹路径 unity_我们来捣鼓一下Unity的平台跳跃Microgame

    作者:Truly 大家好. Platformer Microgame是Unity官方的一个2D平台跳跃游戏项目模板,小伙伴们可以在这个模板的基础上修改或者制作自己的游戏.下边我们就来简单试玩下这个工程 ...

  2. Unity 2D游戏跳跃优化

    2D游戏跳跃下落速度问题 有些2D游戏会感觉到向上跳跃和下落速度不一致,感觉下落时更干脆一些,比如马里奥,不过也跟具体的项目需求手感有关系. 直接上代码.下面是优化下落速度手感的代码. using U ...

  3. unity 2d人物二段跳,多段跳 简单易懂

    unity 2d人物二段跳,多段跳 简单易懂 开门见山,代码见英雄 开门见山,代码见英雄 续前面一篇2d游戏人物跳跃移动unity 2d游戏跳跃移动 手把手教你 isGround = Physics2 ...

  4. Unity 创建2D平台游戏开发学习教程

    了解如何使用C#在Unity中创建您的第一款2D平台游戏 你会学到什么 使用Unity创建2D奥运会 使用可脚本化的对象和单一模式 使用良好的编程实践 创造武器和射弹 使用可脚本化的对象和委托模式创建 ...

  5. Unity 2D游戏开发教程之游戏中精灵的跳跃状态

    Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...

  6. unity 2d摄像机类型_Unity使用笔记2——功能介绍

    记录一下unity的使用技巧. 1.Tag & Layers 选中GameObject后状态栏的第二排有这两种属性可以设置,有一些预设的 tag ,也可以自己加,注意此处的 Layer 并不决 ...

  7. Unity 2D游戏开发快速入门(内部资料)

    Unity 2D游戏开发快速入门(内部资料) 试读样张:http://pan.baidu.com/s/1hqh5oqw Unity 2D游戏开发快速入门4 前  言 Unity是一款综合的游戏开发工具 ...

  8. Unity 2D教程 | 骨骼动画:创建动画

    转载自:2016-02-13 Unity官方平台 本教程主要讲解Unity引擎自带的2D骨骼动画工具,以及2D动画的基本概念.本篇会添加一些动画,如默认状态.跳动.坠落等. 基础动画理论 制作动画要牢 ...

  9. Unity 2D 学习笔记:游戏实例Sunnyland

    Unity 2D 学习笔记:游戏实例Sunnyland 01安装软件&导入素材 02编辑素材&Tilemap 03图层layer&角色建立 04角色移动 05角色方向& ...

最新文章

  1. VNC轻松连接远程Linux桌面
  2. 配置ORACLE 客户端连接到数据库
  3. 计算机等级考试三级数据库考点,全国计算机等级考试辅导:三级数据库考点
  4. 40个非常有创意的404页面设计作品
  5. Linux系统编程---18(线程池相关概念及其实现)
  6. 全网首发!2020年AI、CV、NLP顶会最全时间表!
  7. calendar获取本周一的日期_Java Calendar 获取本周周一和周日代码
  8. Connection对象 Statement对象 ResultSet对象
  9. html二叉树遍历,二叉树的遍历(前序、中序、后序、层次)
  10. C++实现调用C#(CLI)方法
  11. Exploit Kit攻击工具包流量锐减96%!这段时间究竟发生了什么?
  12. HTTP Live Streaming (HLS) 协议科普扫盲
  13. 服务器远程连接端口号修改
  14. Java行业已经饱和了吗?现在转行学Java还有前途吗?
  15. 史上最全的10类常用软件测试工具全都在这(共60+款工具)
  16. 六一儿童节:虽然小时候吹过的牛没实现,幸亏喜欢的零食玩具还买得起
  17. 产品经理—开发转产品,浅谈自我学习与探索
  18. 江苏区块链产业发展试点公示 点燃苏州数字经济新引擎
  19. 管理创意团队的四味真火
  20. 《Linux进程控制---编写简易shell实现》

热门文章

  1. Chrome扩展插件V3版本配置项参数说明
  2. java毕业设计“臻宝”书画竞拍系统(附源码、数据库)
  3. SQLite数据库中rowid使用
  4. 未来的计算机100字的小短文,我的电脑作文100字五篇
  5. 百度地图web 关键字输入智能提示 省市区限制
  6. 百度地图级别总共有19级,以下为详细内容
  7. 大数据之Mapreduce(加强)
  8. 曲线切线的定义和导数(极限)
  9. [转]创业时如何选择合作伙伴
  10. fasttext 安装_科学网—fasttext使用 - 郗强的博文