[周更]4.unity3D_Roll_a_Ball
[周更]4.unity3D_Roll_a_Ball
ε≡٩(๑>₃<)۶ 一心向学
文章目录
- [周更]4.unity3D_Roll_a_Ball
- 前言
- 一、场景搭建
- 1.地板
- 2.墙
- 3.金币
- 4.球
- 二、脚本设计
- 1. 小球的脚本
- 2. 金币的脚本
- 3. 摄像头的脚本
- 4. 金币持续生成的脚本
- 总结
前言
Roll a Ball是一个非常简单的小游戏,非常适合拿来给初学者练手,下图为实现的效果。
一、场景搭建
这里我们介绍相关物体的基础设置,这四个物体的贴图都可以直接在网上找到。
1.地板
地板的存在就是为了防止小球落下去,我们可以直接设置为一个平面。
记住这个平面必须有Mesh Collider组件,这个组件主要就是检测碰撞,防止小球直接掉下去。
2.墙
四个长方体搭在一起……。这四个也要有碰撞检测器。
3.金币
金币是用Cylinder做的,因为金币是我们要拾取的道具,所以它的碰撞修改有点不同。记住这里我们必须把is Trigger勾上,这是为了让小球既能流畅地通过金币,又能成功检测到金币。
4.球
这里我们给小球添加一个刚体组件,这是为了防止小球变形,且能在场景中与其他部件正常交互。同时为了防止小球跳出场景,小球需要有一定重力。
二、脚本设计
1. 小球的脚本
检测既要检测小球的碰撞,又要能通过键盘控制小球的移动。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class RigidBall : MonoBehaviour
{private Rigidbody rigidbody;public float power;// Start is called before the first frame updatevoid Start(){rigidbody = GetComponent<Rigidbody>();}// Update is called once per frameprivate void Update(){//获取水平 垂直输入float hor = Input.GetAxis("Horizontal");float ver = Input.GetAxis("Vertical");//使用刚体模拟小球滚动rigidbody.AddForce(new Vector3(hor, 0, ver) * power);if (Input.GetKeyDown(KeyCode.Space)&&transform.position.y<=0.5f){//跳跃模拟//rigidbody.AddForce(Vector3.up * power);//设置向上速度rigidbody.AddForce(new Vector3(0,10,0)*power);}}//检测是否碰到了墙,碰到了墙就反弹,这个其实可有可无//主要是为了模拟撞墙后的效果,如果没有这个检测,小球//撞墙就会直接停下private void OnCollisionEnter(Collision collision){GameObject other = collision.gameObject;switch (other.tag){case "Wall":float fFlag = -1.0f;if (other.name == "WallUp"){float lAngle = Vector3.Angle(transform.up, Vector3.right);transform.Rotate(Vector3.forward * 2.0f * lAngle * fFlag);}else if (other.name == "WallDown"){float lAngle = Vector3.Angle(transform.up, Vector3.right);transform.Rotate(Vector3.forward * 2.0f * lAngle);}else if (other.name == "WallLeft"){float lAngle = Vector3.Angle(transform.up, Vector3.up);transform.Rotate(Vector3.forward * 2.0f * lAngle * fFlag);}else if (other.name == "WallRight"){float lAngle = Vector3.Angle(transform.up, Vector3.up);transform.Rotate(Vector3.forward * 2.0f * lAngle);}Debug.Log("进入" + collision.gameObject.name);break;default:break;}}#region 触发器碰撞检测函数,主要是为了检测小球撞到金币//注意:两两碰撞必须至少有一方是触发器 必须有一方有刚体组件// Update is called once per frameprivate void OnTriggerEnter(Collider other){Debug.Log("进入" + other.gameObject.name);switch (other.tag){case "coin":GameObject.Destroy(other.gameObject);break;default:break;}}
2. 金币的脚本
这个比较简单,我们只要让金币旋转就好了。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Coin : MonoBehaviour
{// Start is called before the first frame update//可以修改速度public float speed=100;private void Update(){//旋转移动,可有可无transform.Rotate(Vector3.up * speed * Time.deltaTime, Space.World);}
}
3. 摄像头的脚本
让摄像头跟随小球移动,防止小球离开视界。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Camera : MonoBehaviour
{// Start is called before the first frame updatepublic Transform target;//摄像机跟随的目标//偏移量Vector3 offset;private void Start(){//目标位置 - 摄像机位置offset = target.position - transform.position;}private void LateUpdate(){//更新相机位置 保持偏移量不变transform.position = target.position - offset;}
}
注:写完这个后。记得到摄像头的设置界面,将组件设置成如下图所示的情况:
4. 金币持续生成的脚本
我们将这个脚本绑到平面上,这样金币就会不断生成了。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Coin_grow : MonoBehaviour
{// Start is called before the first frame updatepublic float duration;private float m_Time;void Start(){m_Time = duration;}// Update is called once per framevoid Update(){m_Time -= Time.deltaTime; }//这个函数的意思是其将在每次Update函数调用之后调用一次private void LateUpdate(){//每隔一段时间,就生成一个金币。if (m_Time <= 0){GameObject new_coin = GameObject.Instantiate(GameObject.FindGameObjectWithTag("coin"));new_coin.transform.position = new Vector3(Random.Range(-14.5f,14.5f), 0.888f, Random.Range(-14.5f, 14.5f));m_Time = duration;}}
}
总结
Roll_a_Ball只是一个非常简单的小游戏,也没有动画和音效,下周争取整个复杂点的出来。该项目所有的文件都在这了。提取码是73ns。
ᕦ(・ㅂ・)ᕤ(任何不足之处,欢迎大家留言)
[周更]4.unity3D_Roll_a_Ball相关推荐
- 开始记录自己的搬砖学习生涯(尽力周更~~)
开始记录自己的搬砖学习生涯(尽力周更~~) Mon 06 Mon 13 Mon 20 Mon 27 已完成仿真验证 进行编程实验中 计划中 现有任务 目前进行电机缺相保护实验
- 记录我的java之路——day26(周更)
玩转JavaScript JavaScript概述 JavaScript简称JS,一种直译式(无需编译)脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScri ...
- 《卡尔琳记事本》,召唤师的故事,周更
二等男爵麦克在一次出游途中,意外得知自己的小儿子芮恩,竟然具备召唤师的潜质,于是年纪尚幼的芮恩,被送到了西哥伦堡的卡尔琳学院.那里是西哥伦郡的第二大学院,西格玛行省的第三大召唤师学院. 而召唤师的故事 ...
- 2021周更03:周末加了两天班
目录 周五通宵,周末加班 难受到怀疑自我 先满足公司需求,再满足职业要求 思考这份工作的价值 周五通宵,周末加班 周五突然安排了2个紧急的工作任务,周六上线一个,周日上线另一个. 周一到周四清闲了四天 ...
- 周更计划----web安全学习
本周做题---ctfshow(web入门-信息搜集1-18) 目录 web1 web2 web3 web4 web5 web6 web7 web8 web9 web10 web11 web12 web ...
- 简直让人欲罢不能!820个ML Python库,star超260万,持续周更中...
当你发愁找不到合适的开源项目时,有人已经悄悄地整理好了.今天要介绍的这个 GitHub 项目提供了大量机器学习 Python 库,覆盖机器学习框架.数据可视化.强化学习等多个领域,而且项目作者还对每个 ...
- 30天敏捷结果(2):用三个故事驱动你的一周
"Map out your future, but do it in pencil." ~Jon Bon Jovi 要好好计划未来,但也必须随时应形势而变通.--乔恩.博.乔文 ...
- 9月第1周国内搜索类网站频道:百度覆盖数创新高
根据国际统计机构Alexa公布的最新数据显示,9月第1周(2013-09-02至2013-09-08),国内搜索类网站/频道排行榜中,百度以130300的周均用户覆盖数居于榜首,排行第二的是覆盖数为2 ...
- 9月第1周国内IT技术类网站:CSDN覆盖数持续走低
根据国际统计机构Alexa公布的最新数据显示,9月第1周(2013-09-02至2013-09-08),国内IT技术类网站排行榜中,CSDN以1710居于榜首,第二位是1170的博客园,第三位是670 ...
最新文章
- 过滤器在图纸上的符号_零基础秒懂,看了这份建筑符号清单,就能快速识别建筑图纸,收藏...
- 2022年,我该用JAX吗?GitHub 1.6万星,这个年轻的工具并不完美
- 【MySQL】如何最大程度防止人为误操作MySQL数据库?这次我懂了!!
- maven springboot 除去指定的jar包_SpringBoot的运行机制
- 如何使用Emacs Org模式和Reveal.js创建幻灯片
- 如何在opengl用代码绘制英文_如何用AIPS直接绘制服装款式图(线稿)
- Faster-RCNN 训练自己的数据
- Tomcat servers.xml 无注释版
- POJ 2976 Dropping tests | 01分数规划
- 在命令行中使用vs编译器
- 菜鸟教程Python教程100例合集
- Linux 应急响应入门:入侵排查应该这样做
- 计算机专业窗体的事件何时触发,高三计算机专业VB试题(六)1
- sql 两表关联查询
- 谈微软 KMS 激活
- CT一般扫描参数_头颅CT扫描技术
- MarkdownPad2的使用
- firefox插件推荐
- 大二学科不挂科 速冲方法推荐(数据结构+计组+操作系统+算法+数据库+计网)
- 2019年丰巢科技Java面试题