首先声明,Unity版本为5.4.4

这篇主要是针对Unity官网上的一个视频教程,功能就是实现一下Angry Bird中弹弓发射的功能

先去Asset Store上下载2D Sprites Pack素材包,导入到Unity中


下面开始搭建场景:

1.将相机设为正交投影

2.在导入的素材中找到背景并拖到Hierarchy中改名为BackGround

3.在素材中找到地面拖到Hierarchy中并改名为Grass

4.新建一个空物体改名为Ground,多复制几个Grass并在Scene下摆放到适当的位置,调整背景的长度

5.给Ground添加Edge Collider2D并点击Edit Collider调整点的位置使线平行地面且端点位于背景左右

6.在素材中找到弹弓(是俩张图,把1作为0的子物体)拖到Hierarchy上并改名

7.在素材中找到投射物并拖到Hierarchy上改名为Asteroid

8.在Scene视图中摆放合适位置

9.设置Sorting Layer,随便点击场景中的图片,在Sorting Layer上点击Add Sorting Layer,新建ForeGround

10.BackGround设置为Default层,所有的Grass设置为ForeGround层order in layer为0,CatapultSprite设置为ForeGround层,order in layer为0,CatapultSprite_1设置为ForeGround层,order in layer为4,Asteroid设置为ForeGround层,order in layer为2

11.在素材中找到木板拖到场景中,并复制多个,怎么摆放都行,并且添加Box Collider2D和Rigidbody2D


下面开始实现功能

1.给Asteroid添加Circle Collider2D和Rigidbody2D,新建一个 Physics2D Material改名为HighFriction

2.新建一个Material命名为Band

3.给CatapultSprite添加Rigidbody2D并勾选Is Kinematic,分别给CatapultSprite和CatapultSprite_1添加Line Renderer,把Band分别拖到Line Renderer的Materials上

4.给Asteroid添加Spring Joint2D,把CatapultSprite拖拽到Spring Joint2D上的Connected Rigid Body上

新建C#脚本ProjectileDragging并拖到Asteroid上

using UnityEngine;
using System.Collections;public class ProjectileDragging : MonoBehaviour {public float maxStretch = 3.0f;//拉伸长度public LineRenderer catapultLineFront;//弹弓皮筋前面public LineRenderer catapultLineBack;//弹弓皮筋后面private SpringJoint2D spring;//弹簧铰链private Transform catapult;//弹弓private Ray leftCatapultTpProjectile;//用来获取皮筋与投射物接触点的位置private Ray rayToMouse;//用来限制物体的位置private float maxStretchSql;//拉伸长度的平方private Rigidbody2D rb;//刚体private CircleCollider2D circle;//圆形碰撞器private float circleRadius;//圆形碰撞器半径private bool clickedOn;//判断是否是鼠标按下中private Vector2 prevVelocity;//发射出去的速度void Awake(){spring = GetComponent<SpringJoint2D> ();rb = GetComponent<Rigidbody2D> ();circle = GetComponent<CircleCollider2D> ();catapult = spring.connectedBody.transform;}// Use this for initializationvoid Start () {LineRendererSetUp ();rayToMouse = new Ray (catapult.position,Vector3.zero);leftCatapultTpProjectile = new Ray (catapultLineFront.transform.position,Vector3.zero);maxStretchSql = maxStretch * maxStretch;circleRadius = circle.radius;}// Update is called once per framevoid Update () {if (clickedOn)Dragging ();if (spring != null) {//如果弹簧铰链不为空if (!rb.isKinematic && prevVelocity.sqrMagnitude > rb.velocity.sqrMagnitude) {//如果投射物可以受力,且投射速度大于物体自身速度Destroy (spring);//脱离铰链rb.velocity = prevVelocity;//投射}if (!clickedOn)prevVelocity = rb.velocity;//如果拖拽完成,投射速度等于物体自身的速度LineRendererUpdate ();//更新弹弓皮筋} else {catapultLineFront.enabled = false;catapultLineBack.enabled = false;}}private void LineRendererSetUp(){//初始弹弓皮筋catapultLineFront.SetPosition (0,catapultLineFront.transform.position);//设置皮筋与弹弓相连的点的位置catapultLineBack.SetPosition (0,catapultLineBack.transform.position);catapultLineFront.sortingLayerName = "ForeGround";//设置皮筋的渲染层catapultLineBack.sortingLayerName = "ForeGround";catapultLineFront.sortingOrder = 3;//设置同一层的渲染顺序catapultLineBack.sortingOrder = 1;}void OnMouseDown(){spring.enabled = false;//拖拽过程中,弹簧铰链失效clickedOn = true;//拖拽中}void OnMouseUp(){spring.enabled = true;//拖拽完后,恢复铰链rb.isKinematic = false;//拖拽完后,使投射物受力clickedOn = false;}private void Dragging (){//拖拽中持续更新物体位置Vector3 mouseWordPoint = (Camera.main.ScreenToWorldPoint (Input.mousePosition));Vector2 catapultToMouse = mouseWordPoint - catapult.position;if (catapultToMouse.sqrMagnitude > maxStretchSql) {//限制拖拽长度rayToMouse.direction = catapultToMouse;mouseWordPoint = rayToMouse.GetPoint (maxStretch);//在射线的方向上找一个距离射线源点maxStretch的点}mouseWordPoint.z = 0;transform.position = mouseWordPoint;}private void LineRendererUpdate(){//更新弹弓皮筋Vector2 catapultToProjectile = transform.position-catapultLineFront.transform.position;leftCatapultTpProjectile.direction = catapultToProjectile;Vector3 holdPoint = leftCatapultTpProjectile.GetPoint (catapultToProjectile.magnitude+circleRadius);catapultLineFront.SetPosition (1,holdPoint);catapultLineBack.SetPosition (1,holdPoint);}
}

现在就已经可以投射了,但是相机是不动的

新建C#脚本ProjectileFollow并加到相机上

using UnityEngine;
using System.Collections;public class ProjectileFollow : MonoBehaviour {public Transform projectile;//投射物public Transform farLeft;//相机左边界public Transform farRight;//相机右边界// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {Vector3 newPosition = transform.position;newPosition.x = projectile.position.x;newPosition.x = Mathf.Clamp (newPosition.x,farLeft.position.x,farRight.position.x);//限定相机的位置transform.position = newPosition;}
}

在场景中新建三个空物体分别为,Boundary,Left,Right,且Left,Right为Boundary的子物体,修改Left,Right的tag图标(容易区分),在Scene视图中摆好位置


现在基本上完成了

最后加一个游戏重置的功能

在场景中新建一个空物体叫BoundaryCollider,并添加Box Collider2D,调整大小使它将整个场景包起来

这里需要注意一点,我们把BoundaryCollider的z坐标设为了1,只要不是0就行,原因是如果设为0有时鼠标会点在BoundaryCollider上,Asteroid就点不到了,虽然BoundaryCollider的z设为了1但是还是可以触发碰撞

最后新建C#脚本Resetter并挂到BoundaryCollider上

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
public class Resetter : MonoBehaviour {public Rigidbody2D projectile;// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {if (Input.GetKeyDown (KeyCode.R))ReSet ();}void OnTriggerExit2D(Collider2D col){if (col.GetComponent<Rigidbody2D> () == projectile)ReSet ();}private void ReSet(){SceneManager.LoadScene (SceneManager.GetActiveScene().name);}
}

好,完事!

Unity实现Angry Bird弹弓发射功能相关推荐

  1. Unity3D笔记 愤怒的小鸟六 弹弓发射小鸟

    要实现的目标 实现个性化的鼠标 实现弹弓 选择小鸟.拉升弹弓.发射小鸟 弹弓橡皮筋 声音 1.实现个性化鼠标 效果 2.添加弹弓 建立两个材质 创建一个空GameObject 把两个shoot拖进来统 ...

  2. Unity中实现涂鸦和橡皮擦功能

    一.目的 1.想知道:Unity中实现涂鸦和橡皮擦功能 二.参考 1.Unity 实现橡皮擦效果 https://www.cnblogs.com/lzzhentou/p/11634696.html 总 ...

  3. 【游戏开发实战】TapTap物理画线游戏,教你使用Unity实现2D物理画线功能,看到我为你画的彩虹了吗

    文章目录 一.前言 二.思考 三.验证我们的思考 1.创建物体挂组件 2.设置组件参数 3.运行测试 4.结论 四.撸起袖子写代码 1.Line.cs 2.LinesDrawer.cs 五.场景 六. ...

  4. Unity初学者课堂—助手游戏局部功能开发讲解之开始游戏倒计时

    Unity初学者课堂-助手游戏局部功能开发讲解之开始游戏倒计时 学习闲言 游戏开始倒计时 地址栏qq后面号码非本人号码,避免误解已搬家至https://blog.csdn.net/weixin_403 ...

  5. 用unity和php实现一个排行榜功能(unity客户端篇)

    注:此文章需配合以下文章一起使用 用unity和php实现一个排行榜功能(PHP服务端篇) unity客户端篇 目前我用的版本是unity2020,unity2019,这份代码应该也适用 排行榜显示部 ...

  6. Unity 关卡编辑器(自动捕捉功能)

    Unity 关卡编辑器(自动捕捉功能) 使用动机 当编辑场景时,有大量的物体需要按照一定的排列顺序进行仔细的摆放时,unity提供的自动捕捉功能往往不能很好的实现项目的需求,我们需要根据自己的项目去拓 ...

  7. Unity+OpenCV实现摄像头实时抠像功能

    Unity+OpenCV实现摄像头实时抠像功能 工程版本及说明 工程demo说明 抠像核心代码 Demo使用说明 工程地址 新媒体互动行业交流群推广 shader方面 工程版本及说明 Unity201 ...

  8. Unity Text 实现文本上下标功能

    Unity Text 实现文本上下标功能 可修改上下标颜色以及大小 说明: 文本:1[1=上标1(ce)]2[2=下标2($%6)]3[1|30=上标3{^&}]4[2|30=下标4]5[1| ...

  9. 12.完善子弹的发射功能

    """ v1.131.完善子弹的发射功能tank 发射子弹 -> 产生一颗子弹 """ import pygame,time,rand ...

最新文章

  1. R语言I绘制等高线图
  2. 漫画:前端发展史的江湖恩怨情仇
  3. matlab中非0即1函数,matlab 中统计一个数组中非零元素个素的函数名称是什么?
  4. python基础代码-python基础代码
  5. oracle数据库怎么导出dat文件_论将数据从数据库导出为dat格式.docx
  6. 【NPOI】.NET EXCEL导入导出开发包
  7. PTGAN:针对行人重识别的生成对抗网络 | PaperDaily #36
  8. 二进制蚁群算法【源码实现】
  9. 字符串不替代_TI-Nspire 系列的字符串操作
  10. .Net中json序列化与反序列化
  11. ARMv8体系结构基础03:加载和存储指令
  12. FTP和SSH的区别
  13. c语言小树苗健康指数,一颗特别的小树苗.doc
  14. 网络计算机是第几代,操作系统 是在计算机发展的第几代出现的?
  15. 用turtle绘图做一个钟表时钟
  16. 凡人修仙传jar_凡人的贝壳无法逃脱灵魂般的阴影
  17. 上海科技大学和 计算机,上海容易被忽略的高校--上海科技大学,本科升学率近80%,力压复旦、上交!...
  18. 前端瓦片地图加载之塞尔达传说旷野之息
  19. 学习FPGA有必要写SDRAM控制器吗?
  20. Android 8.0恢复出厂设置

热门文章

  1. python异常值处理四分位法_Python清除异常值四分位法
  2. 译文:dBA和dBC的不同
  3. android获取应用内自定义权限与权限使用情况
  4. 读书笔记-《人人都是产品经理V1.1》
  5. 博客添加音乐插件、网站运行时间、文章阅读次数和网站访客统计
  6. java获取月份有几周_java 获取当前日期是本月的第几周,且当月一共有几周
  7. 计算机在it行业的应用,IT行业的前景怎样啊,我是自考本科毕业,计算机应用...
  8. Linux GCC 编译过程分析及常用检错的编译选项
  9. 微信公众平台入门到精通-新浪云计算平台注册和使用
  10. hadoop+HBase+ZooKeeper+Hive完全分布式集群部署安装