一、效果演示(有兴趣的小伙伴可以下载试玩,链接在文末)

二、使用工具

Unity:2019.4.36
VS:2019

三、场景搭建

1、总体预览

四、代码

1、Box.cs(挂载在箱子上)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Box : MonoBehaviour
{public Color finishColor;  //用来记录改变后箱子的颜色private Color originColor;  //用来记录箱子原本的颜色public Vector2 currentDir;  //用来记录箱子移动的方向private void Start(){originColor = GetComponent<SpriteRenderer>().color;FindObjectOfType<GameManager>().totalBoxs++;}private void Update(){//Debug.DrawLine(transform.position + Vector3.left * 0.5f, transform.position + Vector3.left * 0.5f * 2, Color.green);  //显示射线,用来测试if (FindObjectOfType<PlayerControl>().flag && currentDir != Vector2.zero){BackInsitu();FindObjectOfType<PlayerControl>().flag = false;}}public bool CanMoveToDir(Vector2 dir){RaycastHit2D hit = Physics2D.Raycast(transform.position + (Vector3)dir * 0.5f, dir, 0.5f);if (!hit){transform.Translate(dir);currentDir = dir;return true;}return false;}private void OnTriggerEnter2D(Collider2D collision){if(collision.CompareTag("Target")){FindObjectOfType<GameManager>().finishBoxs++;FindObjectOfType<GameManager>().CheckFinsih();GetComponent<SpriteRenderer>().color = finishColor;}}private void OnTriggerExit2D(Collider2D collision){if (collision.CompareTag("Target")){FindObjectOfType<GameManager>().finishBoxs--;FindObjectOfType<GameManager>().CheckFinsih();GetComponent<SpriteRenderer>().color = originColor;}}public void BackInsitu(){transform.Translate(-currentDir);currentDir = Vector2.zero;}
}

2、PlayerControl.cs(挂载在角色上)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class PlayerControl : MonoBehaviour
{Vector2 moveDir;  //用来记录按键按下的方向Vector2 currentMoveDir;  //用来记录角色当前的移动方向public LayerMask layerMask;  //层级public Button ReturnBtn;  //撤销按钮public bool flag;  //判断是否按下撤销按钮private Box box;  //当前箱子public bool playerIsMove;  //判断角色是否移动private Box t;   //上一次移动的箱子private Vector2 _tv;  //上一次箱子移动的方向private Box[] boxs;  //存放所有的箱子public bool isGame = true;  //判断是否在游戏中// Start is called before the first frame updatevoid Start(){ReturnBtn.onClick.AddListener(OnReturnBtnClick);  //给撤销按钮绑定事件boxs = FindObjectsOfType<Box>();  //获取所有的箱子}// Update is called once per framevoid Update(){if (isGame){if (Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D)){moveDir = Vector2.right;}if (Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A)){moveDir = Vector2.left;}if (Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.W)){moveDir = Vector2.up;}if (Input.GetKeyDown(KeyCode.DownArrow) || Input.GetKeyDown(KeyCode.S)){moveDir = Vector2.down;}if (moveDir != Vector2.zero){flag = false;if (IsMove(moveDir)){currentMoveDir = moveDir;Move(moveDir);playerIsMove = true;}else{playerIsMove = false;}if (box != null && t != null && box != t && box.currentDir == Vector2.zero){t.currentDir = _tv;}if (box != null && box.currentDir != Vector2.zero)  //如果当前箱子移动了,就把其他箱子的方位改为零{foreach (var t_box in boxs){if (t_box != box && t_box.currentDir != Vector2.zero){t_box.currentDir = Vector2.zero;}}}}else{playerIsMove = false;}moveDir = Vector2.zero;}}bool IsMove(Vector2 dir){RaycastHit2D hit = Physics2D.Raycast(transform.position, dir, 1f, layerMask);  //射线检测角色当前碰到的物体if (!hit){if (box != null){box.currentDir = Vector2.zero;box = null;}return true;}else{if (hit.collider.GetComponent<Box>() != null){t = null;if (box != null){t = box;}box = hit.collider.GetComponent<Box>();if (t != null && t != box)  //如果碰到不同的箱子{_tv = t.currentDir;t.currentDir = Vector2.zero;}return box.CanMoveToDir(dir);}else{if (box != null && playerIsMove){box.currentDir = Vector2.zero;box = null;}}}return false;}void Move(Vector2 dir)  //角色移动{transform.Translate(dir);}private void OnReturnBtnClick(){transform.Translate(-currentMoveDir);currentMoveDir = Vector2.zero;flag = true;}
}

3、GameManager.cs(创建一个空物体,并将改脚本挂在上面)

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;public class GameManager : MonoBehaviour
{public int totalBoxs;  //场景中箱子的总数public int finishBoxs;  //已完成箱子的数量public GameObject winImage;  //胜利UIpublic Button RestartBtn;  //重新开始按钮// Start is called before the first frame updatevoid Start(){winImage.transform.GetChild(0).GetComponent<Button>().onClick.AddListener(NextStage);  //点击下一关按钮RestartBtn.onClick.AddListener(ResetStage);  //点击重新开始按钮事件}// Update is called once per framevoid Update(){}public void CheckFinsih(){if (finishBoxs == totalBoxs)  //游戏胜利{//RestartBtn.interactable = false;  //禁用重新开始按钮FindObjectOfType<PlayerControl>().ReturnBtn.interactable = false;  //禁用撤销按钮FindObjectOfType<PlayerControl>().isGame = false;  //游戏停止winImage.SetActive(true);  //显示胜利UIif(SceneManager.GetActiveScene().name=="Level03"){winImage.transform.GetChild(0).GetChild(0).GetComponent<Text>().text = "      退出游戏";}}}IEnumerator LoadNextStage()  //两秒后切换场景{yield return new WaitForSeconds(2);SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);}void ResetStage()  //重新加载当前场景{SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);}void GameOver()  //退出游戏{#if UNITY_EDITORUnityEditor.EditorApplication.isPlaying = false;  //编辑器中退出
#elseApplication.Quit();  //打包成EXE文件退出
#endif}void NextStage(){if (SceneManager.GetActiveScene().name == "Level03"){GameOver();}StartCoroutine(LoadNextStage());}
}

五、项目源码链接

链接:https://pan.baidu.com/s/1EAL6divjitk0rdhvJZ_ZKQ
提取码:l1pd

Unity实现推箱子相关推荐

  1. 用unity写一个推箱子

    使用 Unity 制作推箱子游戏需要以下步骤: 创建场景:使用 Unity 内置的工具创建场景,设计关卡布局,定义游戏场景中的各个物体. 设计玩家角色:使用 Unity 内置的 3D 模型制作玩家角色 ...

  2. 11.5项目小结(推箱子Unity导航系统)

    一.推箱子 重难点: 箱子移动,推动箱子. 1.移动: 思路: 按下WASD键,先改变player的角度,然后沿着Z方向移动: if(Input.GetKeyDown(KeyCode.W)){Vect ...

  3. [新手必备]Unity推箱子小游戏C#代码详解(第一篇-代码部分)

    完整项目请参考博客:https://blog.csdn.net/qq_41676090/article/details/96300302 本文为推箱子小游戏C#代码详解第一篇的代码部分,主要讲解 Sy ...

  4. Unity游戏源码分享-3d机器人推箱子游戏

    Unity游戏源码分享-3d机器人推箱子游戏 一个非常意思的3D游戏 工程地址:https://download.csdn.net/download/Highning0007/88098014

  5. 推箱子2-向右推!_保持冷静,砍箱子-me脚

    推箱子2-向右推! Hack The Box (HTB) is an online platform allowing you to test your penetration testing ski ...

  6. c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  7. 【Python游戏】推箱子—老少皆宜的益智游戏,看你能过几关?

    导语 ​ 要说小时候称霸所有翻盖手机的小游戏,除了贪吃蛇,那就是推箱子了. ​​​控制小人将所有箱子放到指定位置,就是这样简简单单的操作,陪伴我度过了无数个没有动画片的时光. ​ ​ ​这个画面是不是 ...

  8. [HDU 1254] 推箱子

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 1 #include<cstdio> 2 #include<queue> ...

  9. 网易游戏2016实习生招聘笔试题目--推箱子

    题目描述 解题思路 对于输入的状态,找出玩家和箱子的位置,并使用坐标记录其位置,然后对于终端输入的走法,依次判断player按该走法一步一步的移动之后是否能够成功.由于思路比较简单,实际内容就是如何让 ...

最新文章

  1. ROS学习手记 - 2.1: Create and Build ROS Package 生成包(Python)
  2. [转]阿里巴巴集团去IOE运动的思考与总结
  3. ubuntu12.04下NFS链接开发板并测试交叉编译的第一个应用
  4. Exp2 后门原理与实践 20164323段钊阳
  5. 18.28 getchar()函数与缓冲区问题
  6. Qt for Python之 PySide2+QML 入门示例
  7. mysql性能调整三板斧
  8. RHEL/CentOS下编译安装Nginx
  9. KMP 算法 学习 整理
  10. 世界坐标系到观察坐标系的变换步骤_shader观察(像机)矩阵变换的一己之见
  11. 高通855比高通675贵多少钱,性能差距有多大?
  12. Topshelf便捷创建Windows服务
  13. 设计模式:卑微的代理模式
  14. 中正平和的机器人学笔记——2. 机械臂逆运动学(附MATAB代码)
  15. 用友U815.0UFO报表知识点分享
  16. php检测移动浏览器,PHP 检测手机浏览器的代码
  17. PassMark 更新排行,苹果 M1 杀疯了
  18. 卫生洁具安装工艺标准
  19. python地图匹配_基于隐马尔科夫模型(HMM)的地图匹配(Map-Matching)算法
  20. ThingsBoard使用规则链将设备信息转发至外部mqtt

热门文章

  1. Chromium浏览器password unlock
  2. input验证邮箱 css,jquery验证邮箱格式并显示提交按钮
  3. 手写数字识别问题(5)——完结
  4. 手机NFC开启门禁方案介绍
  5. Hibernate的DetachedCriteria使用(含Criteria)转载
  6. 扫地机器人水箱背景_一种扫地机器人用水箱及扫地机器人的制作方法
  7. Output Messenger 2.0.10 Full - 即时消息软件(服务端+客户端)
  8. 在MAC环境下玩转树莓派
  9. iOS开发常用代码片段:总有你用得上的功能
  10. Redis基本使用|基本命令|redis事务|Jedis|持久化|订阅|集群|