当前位置:   article > 正文

Unity3D基础案例-见缝插针_unity3d见缝插针

unity3d见缝插针

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

开发版本:unity 5.3.5f

适合人群:初学Unity者

源文件链接请见文末!

开启学习之旅吧!

 

01 场景搭建

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

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

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

  1. public class RotateSelf : MonoBehaviour {
  2. public int speed = 90;
  3. private void Update()
  4. {
  5. //方法一:
  6. transform.Rotate(-Vector3.forward,speed*Time.deltaTime);
  7. //方法二:
  8. //transform.Rotate(-new Vector3(0, 0, speed * Time.deltaTime));
  9. //方法三:
  10. //transform.Rotate(0, 0, -speed * Time.deltaTime);
  11. }
  12. }

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()方法中完成初始化

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

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

  1. private void Update()
  2. {
  3. PinMove();
  4. }
  5. private void PinMove()
  6. {
  7. //isFly判断是否从准备位置StartPoint发射
  8. if (isFly == false)
  9. {
  10. //isReach判断是否从生成位置SpawnPoint移动至发射位置
  11. if (isReach == false)
  12. {
  13. //Vector3.MoveTowards()方法将物体从当前位置直线移动到目标位置
  14. transform.position = Vector3.MoveTowards(transform.position, targetTf.position, speed * Time.deltaTime);
  15. }
  16. //Vector3.Distance()判断两点之间的距离
  17. //如果针的当前位置距离发射位置小于0.05,则停止运动
  18. if (Vector3.Distance(transform.position, targetTf.position) < 0.05f)
  19. {
  20. transform.position = targetTf.position;
  21. isReach = true;
  22. }
  23. }
  24. else
  25. {
  26. //如果处于发射状态,则针向圆方向移动
  27. transform.position = Vector3.MoveTowards(transform.position, targetCirclePos, speed * Time.deltaTime);
  28. if (Vector3.Distance(transform.position, targetCirclePos) < 0.05f)
  29. {
  30. //保证针到达圆的目标位置是统一的
  31. transform.position = targetCirclePos;
  32. //当前发射针的父对象设置为圆,为了让针跟随圆旋转
  33. transform.SetParent(circle);
  34. isFly = false;
  35. }
  36. }
  37. }

新建公共方法StartFly()

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

  1. public void StartFly()
  2. {
  3. isFly = true;
  4. isReach = true;
  5. }

在PinHead上挂载脚本PinHead.cs

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

03 GameManeger游戏管理

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

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

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

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

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

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

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

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

public Text scoreText;

public int score;

可以在Inspector面板完成赋值

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

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

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

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

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

  1. public void GameOver()
  2. {
  3. if (isGameOver) return;
  4. GameObject.FindWithTag("Circle").GetComponent<RotateSelf>().enabled = false;
  5. //开启协程
  6. StartCoroutine(GameOverAnimation());
  7. isGameOver = true;
  8. }

04 添加音乐音效

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

Volume控制音量,适量调节

在GameManager.cs中

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

Update()方法中添加AudioSource.PlayClipAtPoint

  1. if (Input.GetMouseButtonDown(0))
  2. {
  3. score++;
  4. scoreText.text = score.ToString();
  5. currentPin.StartFly();
  6. AudioSource.PlayClipAtPoint(clip,Camera.main.transform.position);
  7. SpawnPin();
  8. }

05 发布PC端

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


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

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/47990
推荐阅读
相关标签
  

闽ICP备14008679号