Unity实现Angry Bird弹弓发射功能
首先声明,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弹弓发射功能相关推荐
- Unity3D笔记 愤怒的小鸟六 弹弓发射小鸟
要实现的目标 实现个性化的鼠标 实现弹弓 选择小鸟.拉升弹弓.发射小鸟 弹弓橡皮筋 声音 1.实现个性化鼠标 效果 2.添加弹弓 建立两个材质 创建一个空GameObject 把两个shoot拖进来统 ...
- Unity中实现涂鸦和橡皮擦功能
一.目的 1.想知道:Unity中实现涂鸦和橡皮擦功能 二.参考 1.Unity 实现橡皮擦效果 https://www.cnblogs.com/lzzhentou/p/11634696.html 总 ...
- 【游戏开发实战】TapTap物理画线游戏,教你使用Unity实现2D物理画线功能,看到我为你画的彩虹了吗
文章目录 一.前言 二.思考 三.验证我们的思考 1.创建物体挂组件 2.设置组件参数 3.运行测试 4.结论 四.撸起袖子写代码 1.Line.cs 2.LinesDrawer.cs 五.场景 六. ...
- Unity初学者课堂—助手游戏局部功能开发讲解之开始游戏倒计时
Unity初学者课堂-助手游戏局部功能开发讲解之开始游戏倒计时 学习闲言 游戏开始倒计时 地址栏qq后面号码非本人号码,避免误解已搬家至https://blog.csdn.net/weixin_403 ...
- 用unity和php实现一个排行榜功能(unity客户端篇)
注:此文章需配合以下文章一起使用 用unity和php实现一个排行榜功能(PHP服务端篇) unity客户端篇 目前我用的版本是unity2020,unity2019,这份代码应该也适用 排行榜显示部 ...
- Unity 关卡编辑器(自动捕捉功能)
Unity 关卡编辑器(自动捕捉功能) 使用动机 当编辑场景时,有大量的物体需要按照一定的排列顺序进行仔细的摆放时,unity提供的自动捕捉功能往往不能很好的实现项目的需求,我们需要根据自己的项目去拓 ...
- Unity+OpenCV实现摄像头实时抠像功能
Unity+OpenCV实现摄像头实时抠像功能 工程版本及说明 工程demo说明 抠像核心代码 Demo使用说明 工程地址 新媒体互动行业交流群推广 shader方面 工程版本及说明 Unity201 ...
- Unity Text 实现文本上下标功能
Unity Text 实现文本上下标功能 可修改上下标颜色以及大小 说明: 文本:1[1=上标1(ce)]2[2=下标2($%6)]3[1|30=上标3{^&}]4[2|30=下标4]5[1| ...
- 12.完善子弹的发射功能
""" v1.131.完善子弹的发射功能tank 发射子弹 -> 产生一颗子弹 """ import pygame,time,rand ...
最新文章
- R语言I绘制等高线图
- 漫画:前端发展史的江湖恩怨情仇
- matlab中非0即1函数,matlab 中统计一个数组中非零元素个素的函数名称是什么?
- python基础代码-python基础代码
- oracle数据库怎么导出dat文件_论将数据从数据库导出为dat格式.docx
- 【NPOI】.NET EXCEL导入导出开发包
- PTGAN:针对行人重识别的生成对抗网络 | PaperDaily #36
- 二进制蚁群算法【源码实现】
- 字符串不替代_TI-Nspire 系列的字符串操作
- .Net中json序列化与反序列化
- ARMv8体系结构基础03:加载和存储指令
- FTP和SSH的区别
- c语言小树苗健康指数,一颗特别的小树苗.doc
- 网络计算机是第几代,操作系统 是在计算机发展的第几代出现的?
- 用turtle绘图做一个钟表时钟
- 凡人修仙传jar_凡人的贝壳无法逃脱灵魂般的阴影
- 上海科技大学和 计算机,上海容易被忽略的高校--上海科技大学,本科升学率近80%,力压复旦、上交!...
- 前端瓦片地图加载之塞尔达传说旷野之息
- 学习FPGA有必要写SDRAM控制器吗?
- Android 8.0恢复出厂设置
热门文章
- python异常值处理四分位法_Python清除异常值四分位法
- 译文:dBA和dBC的不同
- android获取应用内自定义权限与权限使用情况
- 读书笔记-《人人都是产品经理V1.1》
- 博客添加音乐插件、网站运行时间、文章阅读次数和网站访客统计
- java获取月份有几周_java 获取当前日期是本月的第几周,且当月一共有几周
- 计算机在it行业的应用,IT行业的前景怎样啊,我是自考本科毕业,计算机应用...
- Linux GCC 编译过程分析及常用检错的编译选项
- 微信公众平台入门到精通-新浪云计算平台注册和使用
- hadoop+HBase+ZooKeeper+Hive完全分布式集群部署安装