unity 2D平台跳跃游戏背景相对移动
易于复用
使用简单
效果还不错
自动添加背景图层
自动移动背景图层位置
立体感更强,游戏效果更好
代码挂在新建空对象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平台跳跃游戏背景相对移动相关推荐
- asset文件夹路径 unity_我们来捣鼓一下Unity的平台跳跃Microgame
作者:Truly 大家好. Platformer Microgame是Unity官方的一个2D平台跳跃游戏项目模板,小伙伴们可以在这个模板的基础上修改或者制作自己的游戏.下边我们就来简单试玩下这个工程 ...
- Unity 2D游戏跳跃优化
2D游戏跳跃下落速度问题 有些2D游戏会感觉到向上跳跃和下落速度不一致,感觉下落时更干脆一些,比如马里奥,不过也跟具体的项目需求手感有关系. 直接上代码.下面是优化下落速度手感的代码. using U ...
- unity 2d人物二段跳,多段跳 简单易懂
unity 2d人物二段跳,多段跳 简单易懂 开门见山,代码见英雄 开门见山,代码见英雄 续前面一篇2d游戏人物跳跃移动unity 2d游戏跳跃移动 手把手教你 isGround = Physics2 ...
- Unity 创建2D平台游戏开发学习教程
了解如何使用C#在Unity中创建您的第一款2D平台游戏 你会学到什么 使用Unity创建2D奥运会 使用可脚本化的对象和单一模式 使用良好的编程实践 创造武器和射弹 使用可脚本化的对象和委托模式创建 ...
- Unity 2D游戏开发教程之游戏中精灵的跳跃状态
Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...
- unity 2d摄像机类型_Unity使用笔记2——功能介绍
记录一下unity的使用技巧. 1.Tag & Layers 选中GameObject后状态栏的第二排有这两种属性可以设置,有一些预设的 tag ,也可以自己加,注意此处的 Layer 并不决 ...
- Unity 2D游戏开发快速入门(内部资料)
Unity 2D游戏开发快速入门(内部资料) 试读样张:http://pan.baidu.com/s/1hqh5oqw Unity 2D游戏开发快速入门4 前 言 Unity是一款综合的游戏开发工具 ...
- Unity 2D教程 | 骨骼动画:创建动画
转载自:2016-02-13 Unity官方平台 本教程主要讲解Unity引擎自带的2D骨骼动画工具,以及2D动画的基本概念.本篇会添加一些动画,如默认状态.跳动.坠落等. 基础动画理论 制作动画要牢 ...
- Unity 2D 学习笔记:游戏实例Sunnyland
Unity 2D 学习笔记:游戏实例Sunnyland 01安装软件&导入素材 02编辑素材&Tilemap 03图层layer&角色建立 04角色移动 05角色方向& ...
最新文章
- VNC轻松连接远程Linux桌面
- 配置ORACLE 客户端连接到数据库
- 计算机等级考试三级数据库考点,全国计算机等级考试辅导:三级数据库考点
- 40个非常有创意的404页面设计作品
- Linux系统编程---18(线程池相关概念及其实现)
- 全网首发!2020年AI、CV、NLP顶会最全时间表!
- calendar获取本周一的日期_Java Calendar 获取本周周一和周日代码
- Connection对象 Statement对象 ResultSet对象
- html二叉树遍历,二叉树的遍历(前序、中序、后序、层次)
- C++实现调用C#(CLI)方法
- Exploit Kit攻击工具包流量锐减96%!这段时间究竟发生了什么?
- HTTP Live Streaming (HLS) 协议科普扫盲
- 服务器远程连接端口号修改
- Java行业已经饱和了吗?现在转行学Java还有前途吗?
- 史上最全的10类常用软件测试工具全都在这(共60+款工具)
- 六一儿童节:虽然小时候吹过的牛没实现,幸亏喜欢的零食玩具还买得起
- 产品经理—开发转产品,浅谈自我学习与探索
- 江苏区块链产业发展试点公示 点燃苏州数字经济新引擎
- 管理创意团队的四味真火
- 《Linux进程控制---编写简易shell实现》