引言:人生无处不代码,无代码处不人生。小生作为U3D学习之旅中的一员,将基础案例主要开发流程记录下来,与共同兴趣的你分享。

开发版本:unity 5.3.5f

适合人群:初学Unity者

源文件链接请见文末!

开启学习之旅吧!

01 场景搭建

创建2D工程StickPin,并创建新场景MainScene,导入素材,完成初始场景搭建

注意工程路径最好不要有中文

在Circle身上挂载脚本RotateSelf.cs,控制圆圈顺时针旋转

public class RotateSelf : MonoBehaviour {public int speed = 90;private void Update(){//方法一:transform.Rotate(-Vector3.forward,speed*Time.deltaTime);//方法二://transform.Rotate(-new Vector3(0, 0, speed * Time.deltaTime));//方法三://transform.Rotate(0, 0, -speed * Time.deltaTime);}
}

02 开发针

制作针,并设为预制体Pin

PinHead设为Pin的子物体,并设置标签PinHead

为针头添加Rigidbody 2D,Circle Collider 2D组件,并设置Gravity Scale为0,勾选Is Trigger

注意,collider需要加上Rigidbody才能完成触发检测

创建两个空对象,StartPoint作为发射针的位置,SpawnPoint作为生成针的位置

在Pin身上挂载脚本Pin.cs

新建方法PinMove

需要注意目标圆的位置targetCirclePos要加一个偏差值,防止针被圆挡住

在Start()方法中完成初始化

 private void Start(){//GameObject.FindWithTag()需要给对象设置相应标签targetTf = GameObject.FindWithTag("StartPoint").transform;circle = GameObject.FindWithTag("Circle").transform;//偏差值可以根据实际情况调节targetCirclePos = circle.position - new Vector3(0, 1.47f, 0);}

在Update()方法中调用PinMove()方法

private void Update(){PinMove();}private void PinMove(){//isFly判断是否从准备位置StartPoint发射if (isFly == false){//isReach判断是否从生成位置SpawnPoint移动至发射位置if (isReach == false){//Vector3.MoveTowards()方法将物体从当前位置直线移动到目标位置transform.position = Vector3.MoveTowards(transform.position, targetTf.position, speed * Time.deltaTime);}//Vector3.Distance()判断两点之间的距离//如果针的当前位置距离发射位置小于0.05,则停止运动if (Vector3.Distance(transform.position, targetTf.position) < 0.05f){transform.position = targetTf.position;isReach = true;}}else{//如果处于发射状态,则针向圆方向移动transform.position = Vector3.MoveTowards(transform.position, targetCirclePos, speed * Time.deltaTime);if (Vector3.Distance(transform.position, targetCirclePos) < 0.05f){//保证针到达圆的目标位置是统一的transform.position = targetCirclePos;//当前发射针的父对象设置为圆,为了让针跟随圆旋转transform.SetParent(circle);isFly = false;}}}

新建公共方法StartFly()

//用于外部调用,设置针的发射状态

    public void StartFly(){isFly = true;isReach = true;}

在PinHead上挂载脚本PinHead.cs

public class PinHead : MonoBehaviour
{//OnTriggerEnter2D在is Trigger勾选下才能起作用,用于2D触发检测private void OnTriggerEnter2D(Collider2D collision){//如果碰撞物体的tag标签为PinHead,说明碰到其他的针头了if (collision.CompareTag("PinHead")){// GameObject.Find()根据物体名称,找到GameManager物体//GetComponent获取对象身上GameManager组件,调用GameOver方法GameObject.Find("GameManager").GetComponent<GameManager>().GameOver();}}
}

03 GameManeger游戏管理

新建空对象GameManager,挂载脚本GameManager.cs

创建新方法SpawnPin(),用于生成针,并获得针身上挂载的Pin脚本

 void SpawnPin(){//GameObject.Instantiate()新生成的对象类型为Object,所以需要强转为GameObject类型GameObject pin = GameObject.Instantiate(pinPrefabs, spawnPoint.position, pinPrefabs.transform.rotation) as GameObject;//GetComponent用于获取对象的组件,组件名写在<>内currentPin = pin.GetComponent<Pin>();}

新建一个方法GamOver(),用于结束游戏操作

 public void GameOver(){//防止两球碰撞,多次调用GameOver方法if (isGameOver) return;//enabled设为false,则组件失效,圆不能再旋转GameObject.FindWithTag("Circle").GetComponent<RotateSelf>().enabled = false;isGameOver = true;}

在Update()方法类调用SpawnPin方法,鼠标左键点击时,发射当前针,并生成新的针

 private void Update(){//isGameOVer为false,则游戏结束,直接返回,不再执行下面命令if (isGameOver) return;//Input.GetMouseButtonDown(0)监听鼠标左键点击事件if (Input.GetMouseButtonDown(0)){//调用针的StartFly方法,设置针发射currentPin.StartFly();//当前针发射后,再生成针,完成连续发射功能SpawnPin();}}

控制分数显示,设置两个全局变量,注意需要引入命名空间using UnityEngine.UI;

public Text scoreText;

public int score;

可以在Inspector面板完成赋值

在Update方法内添加,如下加粗语句,完成分数的增加和显示

        if (Input.GetMouseButtonDown(0)){//score自增1score++;//ToString()将数值score转为字符串scoreText.text = score.ToString();//调用针的StartFly方法,设置针发射currentPin.StartFly();//当前针发射后,再生成针,完成连续发射功能SpawnPin();}

使用协程实现场景结束效果

  //IEnumerator(迭代器)IEnumerator GameOverAnimation(){while (true){//Lerp线性插值运算,以此实现渐变效果mainCamera.backgroundColor = Color.Lerp(mainCamera.backgroundColor, Color.red, speed * Time.deltaTime);mainCamera.orthographicSize = Mathf.Lerp(mainCamera.orthographicSize, 4, speed * Time.deltaTime);//当到达目标值,则跳出循环if (Mathf.Abs(mainCamera.orthographicSize - 4) < 0.01f){break;}//可理解为每循环一次暂停一帧,下一帧继续,如果不加这句,渐变效果会瞬间完成 yield return 0;}//完成循环后,等待0.2秒yield return new WaitForSeconds(0.2f);//重新加载当前场景SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);}

需要在GameOver()方法内开启协程

 public void GameOver(){if (isGameOver) return;GameObject.FindWithTag("Circle").GetComponent<RotateSelf>().enabled = false;//开启协程StartCoroutine(GameOverAnimation());isGameOver = true;}

04 添加音乐音效

在MainCamera上添加组件AudioSource,audioclip设置背景音乐,勾选play on awake,loop选项

Volume控制音量,适量调节

在GameManager.cs中

添加public AudioClip clip,inspector面板中赋值

Update()方法中添加AudioSource.PlayClipAtPoint

if (Input.GetMouseButtonDown(0)){score++;scoreText.text = score.ToString();currentPin.StartFly();AudioSource.PlayClipAtPoint(clip,Camera.main.transform.position);SpawnPin();}

05 发布PC端

File-BuildSettings 点击Build完成打包,注意打包出的文件要放在同一个文件夹内


至此,见缝插针基础案例开发完成,为了督促自己学习,以后会陆续写一些博客,帮助更多和我一样喜欢游戏开发的同学!

素材及工程文件百度云链接:链接:https://pan.baidu.com/s/1qZqBdYO 密码:3u1t

Unity3D基础案例-见缝插针相关推荐

  1. Unity3D基础案例-双人坦克

    引言:小生今日分享的是双人坦克大战,这也是Unity的官方案例. 开发版本:unity 5.3.5f 适合人群:初学Unity者 源文件链接请见文末! 开启学习之旅吧! 玩法:双方分别用WSAD键或上 ...

  2. Unity3D基础案例-双人乒乓

    引言:人生无处不代码,无代码处不人生.今天给大家分享双人打乒乓游戏的主要开发流程. 开发版本:unity 5.3.5f 适合人群:初学Unity者 源文件链接请见文末! 开启学习之旅吧! 游戏效果预览 ...

  3. Unity3D基础入门之粒子系统(属性介绍+火焰粒子系统案例制作)

    Unity3D基础入门之粒子系统(属性介绍+火焰粒子系统案例制作) 一.属性介绍 1.主面板Particle System (1)Duration:粒子发射周期 图中,5.00即在发射5秒后进入下一个 ...

  4. 【初阶】unity3d官方案例_太空射击SpacingShooter 学习笔记 显示分数时,如何让函数之间相互交流...

    [初阶]unity3d官方案例_太空射击SpacingShooter 学习笔记 显示分数时,如何让函数之间相互交流 一.关于 显示分数时,如何让函数之间相互交流 这是一个非常好的逻辑问题 1 思路:主 ...

  5. 【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D...

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程] ...

  6. TF学习:Tensorflow基础案例、经典案例集合——基于python编程代码的实现

    TF学习:Tensorflow基础案例.经典案例集合--基于python编程代码的实现 目录 Tensorflow的使用入门 1.TF:使用Tensorflow输出一句话 2.TF实现加法 3.TF实 ...

  7. mysql核心数据库_从MySQL基础进军MySQL核心架构 178集MySQL数据库核心基础视频教程 MySQL基础案例教程...

    从MySQL基础进军MySQL核心架构 178集MySQL数据库核心基础视频教程 MySQL基础案例教程 课程目录 (1) 01MySQL基础_课程引入.avi (2) 02MySQL基础_为什么学习 ...

  8. JQuery-学习笔记04【基础——JQuery基础案例】

    Java后端 学习路线 笔记汇总表[黑马程序员] JQuery-学习笔记01[基础--JQuery基础]--[day01] JQuery-学习笔记02[基础--JQuery选择器] JQuery-学习 ...

  9. 计算机应用基础案例教程总结,计算机应用基础案例教程

    包杰军等编著的<计算机应用基础案例教程>以培养职业能力为目标,本着"做学合一"."理论与实践并行"."知识与技能并重"的教育思想 ...

最新文章

  1. linux服务器性能监控命令汇总之sar命令(五)
  2. 计算机组成原理——指令流水线
  3. LeetCode:Unique Binary Search Trees
  4. ASP.NET服务器控件开发(2)--继承WebControl类
  5. 腾讯微博发表带图片的微博
  6. HDU - 1251 统计难题(字典树)
  7. I—爆炸的符卡洋洋洒洒(不模不行的DP)
  8. C# 将DataGridView里面的数据提取到DataTable中
  9. Nginx设置上传文件大小限制
  10. 12年前的 Linux bug 复活,DNS 缓存投毒攻击重现
  11. 如何才能成为一个高效工作的软件工程师?
  12. 豆丁网word文档下载方法集锦
  13. 计算机日期函数公式大全,Excel技巧: 根据日期汇总月份的计算公式
  14. 多因素cox回归结果解释 第二十八讲 R语言-Cox比例风险模型1 - 知乎 (zhihu.com)
  15. Java如何从字符串中提取数字
  16. 什么是边界扫描(boundary scan)?
  17. Mac 新手必看:认识 Mac 桌面
  18. java graphics2d 乱码_Graphics2D 中文乱码
  19. TPMS—胎压监测系统
  20. 倍福PLC和C#通过ADS通信传输Bool数组变量

热门文章

  1. Java程序实现一个空调的类,基于jsp的空调电费管理系统-JavaEE实现空调电费管理系统 - java项目源码...
  2. 万泽云库平台怎么样,靠谱么
  3. 手把手教你使用scrapy框架来爬取北京新发地价格行情(理论篇)
  4. Python爬取豆瓣正在上映的电影
  5. mp3 在线编辑, 音效下载
  6. 1010001b 1101110b怎么用计算机,计算机考试中 求助电脑帝
  7. 一些简单的java,c程序
  8. vue简易导出word文档——docxtemplater使用介绍
  9. TryHackMe-Ra 2(Windows渗透测试)
  10. Consolidate Duplicate Conditional Fragments