Unity见缝插针功能实现


本文提供全流程,中文翻译。

Chinar坚持将简单的生活方式,带给世人!

(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)



游戏效果:


1

Sphere Rotation ——控制球体旋转

了解更多,可以跳转到SiKi学院,观看视频:SiKi学院

SiKi学院——是本人发现的网络教程做的很完善的网络课堂,推荐大家多学,多看

  1. using UnityEngine;
  2. /// <summary>
  3. /// 球体旋转
  4. /// </summary>
  5. public class Whirl : MonoBehaviour
  6. {
  7. public float Speed = 90; //转速
  8. void Update()
  9. {
  10. transform.Rotate(new Vector3(0, 0, -Speed * Time.deltaTime)); //控制自身旋转
  11. }
  12. }

举个栗子


2

Shoot Pin ——射出 针

  1. using UnityEngine;
  2. /// <summary>
  3. /// 发射针
  4. /// </summary>
  5. public class Pin : MonoBehaviour
  6. {
  7. private bool _isBall = false; //是否朝着球走
  8. private bool _isStartPos = false; //是否朝着就位点走
  9. private Transform _startPos; //就位 位置
  10. private Transform _targetBall; //球 位置
  11. private Vector3 _targetOffsetBall; //与球中心的偏移位置(正确位置)
  12. public float Speed = 5; //速度5
  13. void Start()
  14. {
  15. _startPos = GameObject.Find("StartPos").transform; //找到就位 位置
  16. _targetBall = GameObject.Find("Whirl").transform; //找到生成位置
  17. _targetOffsetBall = _targetBall.position; //把球的中心位置,赋值给球偏移位置
  18. _targetOffsetBall.y -= 1.66f; //得到球偏移的正点位置,所以需要球的中心点的Y 减去 1.66f
  19. }
  20. void Update()
  21. {
  22. if (_isBall == false) //朝着球飞 为 false
  23. {
  24. if (_isStartPos == false) //朝着就位点飞 为 false
  25. {
  26. transform.position =
  27. Vector3.MoveTowards(transform.position, _startPos.position, Speed * Time.deltaTime); //朝目标移动(当前位置,目标位置,速度)
  28. if (Vector3.Distance(transform.position, _startPos.position) < 0.05f) //如果当前位置 与 目标位置 < 0.05f
  29. {
  30. _isStartPos = true; //到达就位点
  31. }
  32. }
  33. }
  34. else //如果_isBall 为 True的情况,就说明需要让 箭 从就位点,到球
  35. {
  36. transform.position =
  37. Vector3.MoveTowards(transform.position, _targetOffsetBall, Speed * Time.deltaTime); //朝目标移动(当前位置,目标位置,速度)
  38. if (Vector3.Distance(transform.position, _targetOffsetBall) < 0.05f) //如果当前位置 与 目标位置 < 0.05f
  39. {
  40. transform.position = _targetOffsetBall; //赋值,定点到位
  41. transform.SetParent(_targetBall); //设置父物体
  42. _isBall = false; //到了目标点后,就不需要飞了
  43. }
  44. }
  45. }
  46. /// <summary>
  47. /// 朝着球飞
  48. /// </summary>
  49. public void DistanceBall()
  50. {
  51. _isBall = true;
  52. _isStartPos = true;
  53. }
  54. }

举个栗子


3

Detection Of Failure ——检测 游戏失败

  1. using UnityEngine;
  2. /// <summary>
  3. /// 碰撞检测
  4. /// </summary>
  5. public class Shit : MonoBehaviour
  6. {
  7. /// <summary>
  8. /// 检测碰撞
  9. /// </summary>
  10. /// <param name="col"></param>
  11. private void OnTriggerEnter2D(Collider2D col)
  12. {
  13. if (col.tag == "Shit") //检测到碰撞
  14. {
  15. GameObject.Find("ScriptMount").GetComponent<GameManager>().GameOver(); //调用游戏结束方法
  16. }
  17. }
  18. }

举个栗子


4

GameManager ——游戏控制脚本

了解更多,可以跳转到SiKi学院,观看视频:SiKi学院

SiKi学院——是本人发现的网络教程做的很完善的网络课堂,推荐大家多学,多看

Chinar的GitHub工程案例

  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using UnityEngine.SceneManagement;
  4. using System.Collections;
  5. /// <summary>
  6. /// 总控制脚本
  7. /// </summary>
  8. public class GameManager : MonoBehaviour
  9. {
  10. private Transform _startPos; //就位 位置
  11. private Transform _generatePos; //生成位置
  12. private GameObject _arrowObj; //箭
  13. private Pin _selectPin; //选择的针
  14. private bool _isOver = false; //默认游戏未结束
  15. private int _score = 0; //分数
  16. public Text ScoreText; //分数文本框
  17. private Camera _mainCamera; //主相机组件对象
  18. private float _animationSpeed = 3; //动画播放速度
  19. /// <summary>
  20. /// 初始化数据
  21. /// </summary>
  22. void Start()
  23. {
  24. _startPos = GameObject.Find("StartPos").transform; //找到就位 位置
  25. _generatePos = GameObject.Find("GeneratePos").transform; //找到生成位置
  26. _mainCamera = Camera.main; //指定主相机
  27. GenerateArrow(); //调用生成
  28. }
  29. /// <summary>
  30. /// 生成箭
  31. /// </summary>
  32. public void GenerateArrow()
  33. {
  34. _arrowObj = Resources.Load<GameObject>("Prefabs/Pin"); //动态加载预设物
  35. GameObject obj =
  36. Instantiate(_arrowObj, _generatePos.position, _arrowObj.transform.rotation) as GameObject; //实例化预设物(预设物,位置,旋转信息)
  37. _selectPin = obj.GetComponent<Pin>(); //获取实例化 箭 的脚本Pin
  38. }
  39. /// <summary>
  40. /// 更新函数
  41. /// </summary>
  42. void Update()
  43. {
  44. if (_isOver) return; //如果游戏结束,直接跳出不执行
  45. if (Input.GetMouseButtonDown(0)) //按下鼠标左键
  46. {
  47. _score++; //分数自增
  48. ScoreText.text = _score.ToString(); //给文本赋值,int转string
  49. _selectPin.DistanceBall(); //调用朝着球飞的方法
  50. GenerateArrow(); //生成一个新的箭,准备
  51. }
  52. }
  53. /// <summary>
  54. /// 游戏结束
  55. /// </summary>
  56. public void GameOver()
  57. {
  58. if (_isOver) return; //如果游戏结束状态为True,直接跳出
  59. GameObject.Find("Whirl").GetComponent<Whirl>().enabled = false; //关闭球体旋转
  60. StartCoroutine(GameOverAnimation()); //开启
  61. _isOver = true; //游戏结束
  62. }
  63. /// <summary>
  64. /// 开启协程 —— 游戏结束的动画
  65. /// </summary>
  66. /// <returns></returns>
  67. IEnumerator GameOverAnimation()
  68. {
  69. _isOver = true; //游戏结束
  70. while (true) //死循环
  71. {
  72. //插值运算
  73. //主相机背景色 = 颜色,插值(当前色,目标色,渐变速度)
  74. _mainCamera.backgroundColor = Color.Lerp(_mainCamera.backgroundColor, Color.green, _animationSpeed * Time.deltaTime);
  75. //主相机的正交尺寸 = 运算,插值(当前尺寸,目标尺寸,渐变速度)
  76. _mainCamera.orthographicSize = Mathf.Lerp(_mainCamera.orthographicSize, 3.5f, _animationSpeed * Time.deltaTime);
  77. //判断是否达到目标值 运算,计算向量(当前值 减去 3.5f )< 0.01f的话 跳出
  78. if (Mathf.Abs(_mainCamera.orthographicSize - 3.5f) < 0.01f) break;
  79. yield return 2; //每次暂停一帧
  80. }
  81. yield return new WaitForSeconds(1); //等待1秒
  82. SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); //重载当前场景
  83. }
  84. }


支持

May Be —— 搞开发,总有一天要做的事!

拥有自己的服务器,无需再找攻略!

Chinar 提供一站式教程,闭眼式创建!

为新手节省宝贵时间,避免采坑!

先点击领取 —— 阿里全产品优惠卷 (享受最低优惠)



1 —— 云服务器超全购买流程 (新手必备!)



2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)



3—— Windows 服务器配置、运行、建站一条龙 !



4 —— Linux 服务器配置、运行、建站一条龙 !




" role="presentation">

技术交流群:806091680 ! Chinar 欢迎你的加入


END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究


对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com


对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

Unity 3D游戏-见缝插针源码的更多相关文章

  1. 一个3D ar打飞机的游戏iOS源码

    这是国内目前第一款集合了AR实景,3D游戏和人脸识别的射击游戏,通过旋转和改变手机的角度与位置,所有的射击操作都靠手势来完成,目前所有的源码全部都在这里.appStore地址:https://itun ...

  2. 猜拳游戏GuessGame源码

    该游戏是一款比较不错的猜拳游戏GuessGame源码案例,GuessGame——猜拳游戏,这也是我自己的第一款休闲类的游戏案例,游戏实现也比较简单的,希望这个能够帮大家的学习和使用,更多安卓源码尽在源 ...

  3. 双人对战的球类游戏IOS源码

    双人对战的球类游戏源码,这个是一款双人对战的ios球类游戏源码,游戏的源码也比较详细的,我们在屏幕上下看到各有一个球门,内有一球,两边通过控制轮盘使球进入对方的球门的,其实玩法也很简单的,我们知道体育 ...

  4. 一款类似塔防类的保卫羊村游戏android源码

    一款类似塔防类的保卫羊村游戏源码,这个游戏很像我们平时玩的塔防游戏的,游戏的源码比较完整的,大家可以修改一下或者添加一些广告就可以上线到应用商店了,而且这个游戏目前已经上线国内的一些应用商店了,360 ...

  5. Unity 3D游戏开发学习路线(方法篇)

    Unity 3D本来是由德国的一些苹果粉丝开发的一款游戏引擎,一直只能用于Mac平台,所以一直不被业外人士所知晓.但是后来也推出了2.5版,同时发布了PC版本,并将其发布方向拓展到手持移动设备.Uni ...

  6. pygame系列_小球完全弹性碰撞游戏_源码下载

    之前做了一个基于python的tkinter的小球完全碰撞游戏: python开发_tkinter_小球完全弹性碰撞游戏_源码下载 今天利用业余时间,写了一个功能要强大一些的小球完全碰撞游戏: 游戏名 ...

  7. 《Unity 3D游戏客户端基础框架》概述

    框架概述: 做了那么久的业务开发,也做了一年多的核心战斗开发,最近想着自己倒腾一套游戏框架,当然暂不涉及核心玩法类型和战斗框架,核心战斗的设计要根据具体的游戏类型而定制,这里只是一些通用的基础系统的框 ...

  8. Chrome自带恐龙小游戏的源码研究(七)

    在上一篇<Chrome自带恐龙小游戏的源码研究(六)>中研究了恐龙的跳跃过程,这一篇研究恐龙与障碍物之间的碰撞检测. 碰撞盒子 游戏中采用的是矩形(非旋转矩形)碰撞.这类碰撞优点是计算比较 ...

  9. Chrome自带恐龙小游戏的源码研究(完)

    在上一篇<Chrome自带恐龙小游戏的源码研究(七)>中研究了恐龙与障碍物的碰撞检测,这一篇主要研究组成游戏的其它要素. 游戏分数记录 如图所示,分数及最高分记录显示在游戏界面的右上角,每 ...

随机推荐

  1. 02_DllZZ.def

    ZC: 在VC6里面,只要有这个文件就可以了.但是到了 VS2010,需要手动的指定使用这个文件才行:VS2010-->项目-->属性--> 来到窗口"??? 属性页&qu ...

  2. [ios]NSThread传值 NSValue传值

    NSThread:http://www.cocoachina.com/bbs/read.php?tid=51873 NSValue:http://blog.sina.com.cn/s/blog_bf9 ...

  3. 《A_Pancers团队》———团队项目原型设计与开发

    一.实验目的与要求 (1)掌握软件原型开发技术: (2)学习使用软件原型开发工具:本实验中使用墨刀 二.实验内容与步骤 任务1:针对实验六团队项目选题,采用适当的原型开发工具设计团队项目原型: 任务2 ...

  4. Codeforces C - Om Nom and Candies

    C - Om Nom and Candies 思路:贪心+思维(或者叫数学).假设最大值max(wr,wb)为wr,当c/wr小于√c时,可以枚举r糖的数量(从0到c/wr),更新答案,复杂度√c:否 ...

  5. 算法笔记--priority_queue

    算法笔记 priority_queue<int>que;//默认大顶堆 或者写作:priority_queue<int,vector<int>,less<int&g ...

  6. Unity如何判断一个对象是不是一件衣服

    判断该对象及其子对象上是否有SkinnedMeshRenderer组价即可 public static bool IsCloth(Transform obj) { bool isCloth = fal ...

  7. Java 常用对象-基本类型的封装类

    2017-11-04 20:39:26 基本类型封装类:基本类型的封装类的好处是可以在对象中定义更多的功能方法操作该数据. 常用操作之一:用于基本数据类型与字符串的转换. 基本类型和包装类的对应: b ...

  8. centos7: svbversion版本的安装配置+tortoisesvn登录验证

    centos7: svbversion版本的安装配置+tortoisesvn登录验证 命令工具:svnadmin create #创建版本库 hotcopy #版本库热备份 Islocks #打印所有 ...

  9. yii CFormModel中的rules验证机制

    public function rules() { return array( array('username, password', 'required'), array('rememberMe', ...

  10. C# WPF 利用NPOI读写Excel文件

    https://blog.csdn.net/a312024054/article/details/70139172 [各种样式] https://www.cnblogs.com/xwgli/archi ...