【Unity3D】利用物体碰撞检测、键盘输入处理完成平衡球游戏

news/2024/10/19 19:40:42/

物体碰撞检测是游戏编程里面非常常用的功能,一旦碰到就怎么怎么样,比如掉血等。Unity3D直接就提供了物体碰撞检测的接口,实现起来很方便。借此功能,完成了一个平衡球游戏,同时说明Unity3D的物体碰撞检测、键盘输入处理的检测的使用。游戏如下图所示:


一、场景布置

1、UI方面布置如下所示,基本就是《【Unity3D】对话框、隐藏与显示、拖拽》(点击打开链接)的内容,不赘述了。StartModal和GameoverModal本质是Image,将他们重叠在一起,一会儿将用脚本隐藏GameoverModal。


2、大致上3D的场景布置如下图所示,基本上就《【Unity3D】物体、材质的设置、物体位移与旋转》(点击打开链接)的内容,也没什么难的。注意,此处的Cube的透明材质,不是默认的Diffuse,而是带透明的Transparent/Diffuse。


唯一需要注意的是,组成盒子的4个Cube,由于Plane的实际大小刚好是10x10,那么就应该分别在XOZ平面的(5,0),(-5,0),(0,5),(0,-5)的位置,且在(5,0)和(-5,0)平面的两个Cube,在X方面只延伸0.1,Z方面延伸10,高度Y方面延伸2,而在(0,5),(0,-5)的两个Cube,则刚好反之,在在X方面只延伸10,Z方面延伸0.1,高度Y方面同样延伸2个位置,刚好形成四堵墙。做好之后,将其余3堵墙拖到其中1个下面,构成一个整体,再同盒子底面的Cube共同拖到Plane之下。

3、我们还需要对作为盒子边缘墙体的父Cube赋予Tag,具体如下图操作:


4、同时还要创建一个空物体GameObject赋予脚本。

二、脚本设置

设置脚本也很简单,具体在《【Unity3D】Helloworld》(点击打开链接)提到过了,如下图所示,将设置如下脚本:


1、首先是Plane.cs

using UnityEngine;
using System.Collections;public class Plane : MonoBehaviour
{// Use this for initializationvoid Start(){}// Update is called once per framevoid Update(){if (Time.timeScale != 0)//如果游戏没有结束,将允许用户通过wasd或者上下左右操作{if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)){transform.Rotate(Vector3.right * 1);}if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow)){transform.Rotate(-Vector3.right * 1);}if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)){transform.Rotate(-Vector3.forward * 1);}if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)){transform.Rotate(Vector3.forward * 1);}}}}
此处是指出了Unity3D如何处理键盘输入的,和其余编程语言一样,只要得知键码,通过条件判断就好。

2、ui.cs

using UnityEngine;
using System.Collections;public class ui : MonoBehaviour
{// Use this for initializationvoid Start(){}// Update is called once per framevoid Update(){}//就是开始游戏之时,游戏说明那个对话框中的确定按钮。public void onStart(){Destroy(GameObject.Find("StartModal"));//点击之后,将这个对话框销毁。}//就是Gameover的时候,“重新开始”的按钮public void onRestart(){Application.LoadLevel("BalanceBall");}
}
将ui.cs赋予给空物体GameObject之后,和《【Unity3D】场景切换、UGUI组件事件、开始游戏与关闭游戏》( 点击打开链接)提到的方法一样,设置StartModal中的Button按钮的OnClick事件为onStart(),而GameoverModal中的Button按钮的OnClick事件为onRestart()。

3、Ball.cs

这脚本就是整个游戏的核心,同时展示如何使用Unity3D的物体碰撞检测。

using UnityEngine;
using UnityEngine.UI;
using System.Collections;public class Ball : MonoBehaviour
{int score = 0;//游戏分数GameObject GameoverModal;//结束游戏对话框void Awake(){Time.timeScale = 1;//打开时间结界GameoverModal = GameObject.Find("GameoverModal");//上来先获取结束游戏的对话框}void Start(){GameoverModal.SetActive(false);//隐藏结束游戏的对话框}void Update(){//此处判断小球是否飞离了箱子,通过坐标判断if (GameObject.Find("Sphere").transform.position.x > 6 ||GameObject.Find("Sphere").transform.position.z > 6 ||GameObject.Find("Sphere").transform.position.x < -6 ||GameObject.Find("Sphere").transform.position.z < -6 ||GameObject.Find("Sphere").transform.position.y < -6){Time.timeScale = 0;//布置一个时间结界,相当于暂停游戏}if (Time.timeScale != 0)//如果时间结界不存在,那么就意味着游戏在进行中{score = System.Convert.ToInt32(GameObject.Find("Score").GetComponent<Text>().text);//获取Score那个文本,并转化为int整形score += System.Convert.ToInt32(rigidbody.velocity.magnitude);//加上此刚体,也就是这个球的速度GameObject.Find("Score").GetComponent<Text>().text = score.ToString();//刷新Score那个文本}else//如果时间结界存在,就意味着游戏结束了{GameoverModal.SetActive(true);//显示重新开始游戏的对话框GameObject.Find("GameoverText").GetComponent<Text>().text = "你的得分:" + score;//更新对话框中的文本}}// 碰撞开始void OnCollisionEnter(Collision collision)//也就是如果一旦球和四面墙,也就是任意一个Cube发生碰撞{if (collision.collider.tag == "Cube1")//碰撞的是Cube1,而不是Plane{Time.timeScale = 0;//打开时间结界}}/*碰撞检测还可以这样用*/// 碰撞结束void OnCollisionExit(Collision collision){}// 碰撞持续中void OnCollisionStay(Collision collision){}
}
此脚本注意在初始化的时候要重新打开时间结界,虽然Time.timeScale默认是等于1的,但因为下面一些列的操作会导致Time.timeScale=0,在ui.cs的重新载入场景不会更新这个Time.timeScale,并同时注意获取这个GameModal实例。这是必要的,不是画蛇添足,具体原因在《【Unity3D】SetActive的NullReferenceException与LoadLevel的初始化》( 点击打开链接)说过了。


至此,整个游戏做完,编译,发布,则得到一个平衡球的游戏。

这里不设置4个cube围着plane,直接用碰撞结束OnCollsionExit判断游戏是否结束是不行的,因为小球在滚动过程中,是会跳动的,在某几个没有滑出Plane的瞬间,是会因Plane的旋转产生的跳动,而偶尔离开这个Plane的。


http://www.ppmy.cn/news/375851.html

相关文章

晨枫U盘维护工具V2.0版(转)

-- 珠海晨枫工作室 制作教程&#xff1a; HDD模式 | ZIP模式 | U写入模式 | 本地硬盘安装 | 重装封装光盘[光盘版/量产] 更新说明&#xff1a; 2009.1.10: 1、增加支持更多的启动模式&#xff0c;现在支持USB-HDD、USB-ZIP、U写入、光盘启动、U盘量产USB-CDROM等多种启动模式&a…

linux下做pe工具,手工组合制作多功能U盘维护工具(LINUX、PE、DOS、GHOST)

以前都是采用的论坛大佬们的一键式搞定 今天突发奇想自己手工弄一下&#xff1a; 首先使用工具&#xff1a; USBBOOT (U盘格式化引导) UltraISO(ISO文件读取) 深度袖珍PE & Dos系统维护光盘V2.5 ISO文件 步骤&#xff1a; USBBOOT格式化成 USB-HDD模式 引导成功 然后用 U…

服务器优盘启动安装win7系统教程,晨枫u盘启动工具安装原版Win7的两种方法(32位64位系统通用)...

安装原版Win7两类方法 第一类方法(32位64位系统通用)&#xff1a; 具体步骤&#xff1a; 【1】先使用晨枫U盘启动制作工具制作完启动U盘(参照制作教程)。 【1】找到Windows7系统的iso镜像&#xff0c;用UltraISO或者WinRAR打开iso镜像&#xff0c;然后提取/解压所有文件到你的U…

Android陀螺仪应用_平衡球小游戏

平衡球小游戏 在手机硬件还不够发达的早些时候,简易的"体感游戏"成为了手机游戏中的一个大头。 利用设备上自带的动态传感器&#xff0c;通过摇晃手机等方式&#xff0c;移动游戏物体来游玩的游戏。 为了成功理解陀螺仪的使用,我试着还原了一个类似的小游戏。 可以…

晨枫U盘维护V2.0_512M被淹死的鱼修正版

晨枫U盘维护V2.0_512M被淹死的鱼修正版.rar 1.加入晨枫U盘维护工具V2.0版MaxDOS7.1升级文件 2.修正DiskGenius时间过期不能用 MD5&#xff1a;F5641C75FDAC18023194E900F79DE516 晨枫U盘维护工具V2.0原版下载地址 http://myfeng.cn/ 晨枫U盘维护工具V2.0版正式发布 更新说明&am…

技术员常用的工具晨枫U盘维护工具V2.0版

1、增加支持更多的启动模式&#xff0c;现在支持USB-HDD、USB-ZIP、U写入、光盘启动、U盘量产USB-CDROM等多种启动模式&#xff0c;并支持新出的U写入模式&#xff0c;支持写入HDD/ZIP启动模式&#xff1b; 2、MAXDOS更新使用V7标准版带&#xff08;ghost11.5&#xff09;&…

Android陀螺仪应用:平衡球小游戏

平衡球小游戏 在手机硬件还不够发达的早些时候,简易的"体感游戏"成为了手机游戏中的一个大头。 利用设备上自带的动态传感器&#xff0c;通过摇晃手机等方式&#xff0c;移动游戏物体来游玩的游戏。 为了成功理解陀螺仪的使用,我试着还原了一个类似的小游戏。 可以…

晨枫U盘维护V2.0_512M版给U盘分区

为什么普通的U盘不能分区&#xff0c;因为U盘没有格式化成硬盘的格式&#xff0c;就是说没有做成启动盘&#xff0c;用晨枫U盘维护V2.0_512M版 可将U盘制成U盘启动盘&#xff0c;我个人的做法是选4&#xff0c;即“UltraISO 写入 <ZIP模式>”&#xff0c;之后按照…