Unity实现推箱子
一、效果演示(有兴趣的小伙伴可以下载试玩,链接在文末)
二、使用工具
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实现推箱子相关推荐
- 用unity写一个推箱子
使用 Unity 制作推箱子游戏需要以下步骤: 创建场景:使用 Unity 内置的工具创建场景,设计关卡布局,定义游戏场景中的各个物体. 设计玩家角色:使用 Unity 内置的 3D 模型制作玩家角色 ...
- 11.5项目小结(推箱子Unity导航系统)
一.推箱子 重难点: 箱子移动,推动箱子. 1.移动: 思路: 按下WASD键,先改变player的角度,然后沿着Z方向移动: if(Input.GetKeyDown(KeyCode.W)){Vect ...
- [新手必备]Unity推箱子小游戏C#代码详解(第一篇-代码部分)
完整项目请参考博客:https://blog.csdn.net/qq_41676090/article/details/96300302 本文为推箱子小游戏C#代码详解第一篇的代码部分,主要讲解 Sy ...
- Unity游戏源码分享-3d机器人推箱子游戏
Unity游戏源码分享-3d机器人推箱子游戏 一个非常意思的3D游戏 工程地址:https://download.csdn.net/download/Highning0007/88098014
- 推箱子2-向右推!_保持冷静,砍箱子-me脚
推箱子2-向右推! Hack The Box (HTB) is an online platform allowing you to test your penetration testing ski ...
- c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目
C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...
- 【Python游戏】推箱子—老少皆宜的益智游戏,看你能过几关?
导语 要说小时候称霸所有翻盖手机的小游戏,除了贪吃蛇,那就是推箱子了. 控制小人将所有箱子放到指定位置,就是这样简简单单的操作,陪伴我度过了无数个没有动画片的时光. 这个画面是不是 ...
- [HDU 1254] 推箱子
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 1 #include<cstdio> 2 #include<queue> ...
- 网易游戏2016实习生招聘笔试题目--推箱子
题目描述 解题思路 对于输入的状态,找出玩家和箱子的位置,并使用坐标记录其位置,然后对于终端输入的走法,依次判断player按该走法一步一步的移动之后是否能够成功.由于思路比较简单,实际内容就是如何让 ...
最新文章
- ROS学习手记 - 2.1: Create and Build ROS Package 生成包(Python)
- [转]阿里巴巴集团去IOE运动的思考与总结
- ubuntu12.04下NFS链接开发板并测试交叉编译的第一个应用
- Exp2 后门原理与实践 20164323段钊阳
- 18.28 getchar()函数与缓冲区问题
- Qt for Python之 PySide2+QML 入门示例
- mysql性能调整三板斧
- RHEL/CentOS下编译安装Nginx
- KMP 算法 学习 整理
- 世界坐标系到观察坐标系的变换步骤_shader观察(像机)矩阵变换的一己之见
- 高通855比高通675贵多少钱,性能差距有多大?
- Topshelf便捷创建Windows服务
- 设计模式:卑微的代理模式
- 中正平和的机器人学笔记——2. 机械臂逆运动学(附MATAB代码)
- 用友U815.0UFO报表知识点分享
- php检测移动浏览器,PHP 检测手机浏览器的代码
- PassMark 更新排行,苹果 M1 杀疯了
- 卫生洁具安装工艺标准
- python地图匹配_基于隐马尔科夫模型(HMM)的地图匹配(Map-Matching)算法
- ThingsBoard使用规则链将设备信息转发至外部mqtt
热门文章
- Chromium浏览器password unlock
- input验证邮箱 css,jquery验证邮箱格式并显示提交按钮
- 手写数字识别问题(5)——完结
- 手机NFC开启门禁方案介绍
- Hibernate的DetachedCriteria使用(含Criteria)转载
- 扫地机器人水箱背景_一种扫地机器人用水箱及扫地机器人的制作方法
- Output Messenger 2.0.10 Full - 即时消息软件(服务端+客户端)
- 在MAC环境下玩转树莓派
- iOS开发常用代码片段:总有你用得上的功能
- Redis基本使用|基本命令|redis事务|Jedis|持久化|订阅|集群|