Unity-捕鱼达人相关知识点记录
目录
- (一)开始场景的制作
- 1.1 如何将默认3D行为转换位2D行为
- 1.2 搭建2D游戏场景
- 1.3 气泡特效的添加
- 1.4 水波荡漾效果的制作
- (二)游戏运行场景的搭建
- 2.1场景中Canvas中层级关系
- (三)游戏逻辑实现
- 3.1 枪口跟随鼠标移动
- 3.2如何制作鱼的精灵动画
- 3.3鱼群的生成
- 3.4销毁超出边界的鱼
- 3.5子弹的发射
- 3.6解决UI穿透并设置子弹属性
- 如何让生成的金币以某速度移动到某位置并销毁
(一)开始场景的制作
1.1 如何将默认3D行为转换位2D行为
点击右边属性面板中的Default Behavior Mode,区别在于2D相机的默认是正交的,3D默认是透视,额外多给一个平行光.
正交视图无法看到一个物体是远离自己还是正在我们面前。为什么?因为它不会根据距离收缩。所以如果你如果你画一个固定大小的物体在视点前面,同时画一个同样大小的物体在第一个物体的远后方,你无法说那个物体是第一个。因为两个都是一样的大小,根距离无关。他们不会随着距离而收缩。通常我们在unity中制作2D UI,或是2D游戏的时候,就会把Camera的投射选择此项,例如NGUI的UICamera组件,默认的视图就是正交,还有2DTookit,也会把Main Camera的视图选择成正交
透视Perspective (有消失点投影)
透视视图和我们从眼睛看到的视图是一样的。例如,一个高个子的人站在你面前,他看上去是很高的。但是如果这个高个子站在100米以外,他甚至还没有你的拇指大。他看上去会随着距离而缩小,但是我们实际上都知道,它依然是个高个子。这种效果叫做透视。上面例子中提到的两个物体,第二个物体将会显示地更小,所以我们可以区分哪个是离我们近的物体,那个是离我们远的物体。这个在3D中经常用到,例如3D Max中几种不同的视图,而Unity的Main Camera默认也是这种视图。
1.2 搭建2D游戏场景
将Canvas的模式更改:Overlay模式会将Canvas覆盖在游戏场景上,Camera模式会与相机之间产生层级,更加灵活。
然后将相机改成正交模式
最后将相机拖入Canvas中
初始场景搭建完毕,我们可以在Canvas上添加内容,也可以根据情况在相机和Canvas之间添加Canvas.
1.3 气泡特效的添加
创建一个空物体,将Z设为95,然后在上面挂载气泡特效物体
1.4 水波荡漾效果的制作
添加一个Plane,在z=95位置,将制作好的材质添加上去,通过脚本修改材质中的贴图纹理(texture)形成水波荡漾的效果
public class EF_WaterWave : MonoBehaviour
{public Texture[] texture; //存储需要更换的图片组private Material material; private int index = 0;void Start(){material = GetComponent<MeshRenderer>().material;//在指定的时间间隔调用传入的方法InvokeRepeating("ChangeTexture", 0, 0.1f);}void ChangeTexture(){material.mainTexture = texture[index];index = (index + 1) % texture.Length;}
}
(二)游戏运行场景的搭建
2.1场景中Canvas中层级关系
通过新建Canvas,然后设置Order in Layer = 90(越大显示越上层),然后将游戏内容在上面绘制,BgCanvas辅助绘制背景其Order in Layer = 0
(三)游戏逻辑实现
3.1 枪口跟随鼠标移动
调整好枪的位置,让其通过改动Rotation可以正确旋转
然后添加脚本,通过获取鼠标的位置计算后修改Rotation的值
public class GunFollow : MonoBehaviour {public RectTransform UGUICanvas;public Camera mainCamera;void Update () {//获取鼠标位置Vector3 mousePos;//将屏幕坐标转换为世界坐标RectTransformUtility.ScreenPointToWorldPointInRectangle(UGUICanvas,//当前所在的Canvas//获取鼠标当前的位置new Vector2(Input.mousePosition.x,Input.mousePosition.y),mainCamera, //观察镜头out mousePos);//计算夹角,鼠标当前位置与y轴之间的夹角,根据位置调整正负float z;if (mousePos.x > transform.position.x){z = -Vector3.Angle(Vector3.up, mousePos - transform.position);}else {z = Vector3.Angle(Vector3.up, mousePos - transform.position);}//因为在UGUI下用这个函数transform.localRotation = Quaternion.Euler(0,0,z);}
}
3.2如何制作鱼的精灵动画
选中多张精灵图,将其拉入场景,制作成预制体放入Resources文件夹下,动画放入Animations中
3.3鱼群的生成
首先创建鱼群的出口,空物体标记好位置,并让每个位置的X轴指向屏幕内
在代码中获取其位置
//存储生成13个位置private Transform[] genPositions;genPositions = new Transform[13];genPositions[0] = GameTool.FindTheChild(this.gameObject, "UM");genPositions[1] = GameTool.FindTheChild(this.gameObject, "RM");genPositions[2] = GameTool.FindTheChild(this.gameObject, "LM");genPositions[3] = GameTool.FindTheChild(this.gameObject, "UL");genPositions[4] = GameTool.FindTheChild(this.gameObject, "UR");genPositions[5] = GameTool.FindTheChild(this.gameObject, "DL");genPositions[6] = GameTool.FindTheChild(this.gameObject, "DR");genPositions[7] = GameTool.FindTheChild(this.gameObject, "UQ1");genPositions[8] = GameTool.FindTheChild(this.gameObject, "UQ2");genPositions[9] = GameTool.FindTheChild(this.gameObject, "LQ1");genPositions[10] = GameTool.FindTheChild(this.gameObject, "LQ2");genPositions[11] = GameTool.FindTheChild(this.gameObject, "RQ1");genPositions[12] = GameTool.FindTheChild(this.gameObject, "RQ2");
获得鱼的预制体
private GameObject[] fishPrefabs;fishPrefabs = Resources.LoadAll<GameObject>("Prefabs/fish");
在一个空物体上实例
//存放鱼private Transform fishHolder;fishHolder = GameTool.FindTheChild(this.gameObject, "FishHoder");GameObject fish = Instantiate(fishPrefabs[fishPreIndex]);fish.transform.SetParent(fishHolder, false);fish.transform.localPosition = genPositions[genPosIndex].localPosition;fish.transform.localRotation = genPositions[genPosIndex].localRotation;
让鱼群走直线
angOffset = Random.Range(-22, 22);//直走的倾斜角度fish.transform.Rotate(0, 0, angOffset);//鱼群移动脚本public float speed = 1f;public Vector3 dir = Vector3.right;void Update () {transform.Translate(dir*speed*Time.deltaTime);}
让鱼群走曲线
int angSpeed; //转弯的角速度//鱼的拐弯脚本,移动脚本同直线public float speed = 10f; // Update is called once per framevoid Update () {transform.Rotate(Vector3.forward,speed*Time.deltaTime);//围绕Z轴转}
完成鱼群的生成
3.4销毁超出边界的鱼
添加四个空物体,设置好宽高,包围住游戏场景,为其添加触发器,设置好Tag做识别
在每条鱼生成时挂上属性脚本,当鱼碰撞到Tag为Border时候销毁自身
private void OnTriggerEnter2D(Collider2D collision){if (collision.tag == "border"){Destroy(gameObject); //销毁自身}}
3.5子弹的发射
//在Update中调用void Fire(){//子弹相关初始化bulletHolder = GameTool.FindTheChild(GameRun, "BulletHoder");bullet1Gos = Resources.LoadAll<GameObject>("Prefabs/Bullet/1");bullet2Gos = Resources.LoadAll<GameObject>("Prefabs/Bullet/2");bullet3Gos = Resources.LoadAll<GameObject>("Prefabs/Bullet/3");bullet4Gos = Resources.LoadAll<GameObject>("Prefabs/Bullet/4");bullet5Gos = Resources.LoadAll<GameObject>("Prefabs/Bullet/5");//子弹实例化,当鼠标点击时,并且点击的不是UI控件区域 发射子弹if (Input.GetMouseButtonDown(0) && EventSystem.current.IsPointerOverGameObject() == false){GameObject[] useBullets = bullet1Gos;GameObject bullet = Instantiate(useBullets[useBulletIndex]); bullet.transform.SetParent(bulletHolder, false);bullet.transform.position = GunGos[CostIndex / 4].transform.Find("FirePos").transform.position;bullet.transform.rotation = GunGos[CostIndex / 4].transform.Find("FirePos").transform.rotation;bullet.AddComponent<EF_AutoMove>().dir = Vector3.up;//挂上移动脚本}}
3.6解决UI穿透并设置子弹属性
将背景图属性中(是否是射线的检测目标)取消勾选
在代码中添加判断,判断鼠标点击的是否为游戏物体
if (Input.GetMouseButtonDown(0) && EventSystem.current.IsPointerOverGameObject() == false)
如何让生成的金币以某速度移动到某位置并销毁
private GameObject goldCollect;// Use this for initializationvoid Start () {goldCollect = GameObject.Find("GoldCollect"); }// Update is called once per framevoid Update () {//通过插值的方式飞向金币收集袋transform.position = Vector3.MoveTowards(transform.position,goldCollect.transform.position,50*Time.deltaTime); }
//为金币和收集器添加触发器和Tag,给收集器挂上脚本,碰撞后销毁金币private void OnTriggerEnter2D(Collider2D collision){if (collision.tag == "Gold"){AudioManager.Instance.PlayGoldEffectMusic("FX_银币_01");Destroy(collision.gameObject);}}
Unity-捕鱼达人相关知识点记录相关推荐
- unity捕鱼达人3----UI界面的制作以及相关功能的实现
从上述两幅图中我们可以看到主要UI有:开始游戏,继续游戏,倒计时以及金币,等级和名称等等. 一:开始界面的实现 因为我们要进入游戏界面所以我们肯定要加载游戏界面,所以在Unity中我们有SceneMa ...
- 游戏制作之路-unity捕鱼达人(一 开始以及加载界面的制作)
Unity捕鱼达人的制作 一.创建开始界面 根据上一篇我们所讲的,很容易就能把开始界面做出来. 二.游戏加载场景 游戏加载条的制作,我是用到了unity中的slider UI组件,如图 slider组 ...
- Unity捕鱼达人5-----鱼群的生成
在捕鱼达人的游戏中可以发现鱼群会从四面八方来进行生成 并且有些鱼群会进行直线游走,游戏鱼群会进行转弯游走,以上是这个游戏的核心之一. 原理:可以在游戏界面的外面一圈放置几个空物体(该空物体类似鱼的出生 ...
- unity捕鱼达人----炮台的旋转的实现以及水波纹动画的制作
炮台的旋转 炮台的转向由鼠标控制,当我们控制鼠标向右旋转使可以发现,炮台的position为负的 所以我们可以以炮台的正方向与鼠标位置的夹角来实现炮台的旋转 如图中所示用加粗笔所画的表示MousePo ...
- YII相关知识点记录
1.YII脚本名称在url重的显示与否 YII的入口文件是index.php,很多时候为了url的美观设置其不现实又或者显示,这在YII的配置文件中石油相关的配置的. 在components中添加如下 ...
- Unity捕鱼达人4-----鱼的游动动画以及死亡动画实现以及对应子弹击中鱼后造成伤害的实现和生成金币特效
鱼的动画 在Game视图中可以发现鱼在游动,这是通过动画来实现的. 1.在Project面板选中资源包中的相关动物的图片后托入Hierarchy面板中 接着会弹出界面 我们将放在Animation文件 ...
- python正则表达式相关知识点记录
笔记来源于b站的python高级编程中的资料 在python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块 -- re 目录 一.re模块的基本操作 二.匹配单个字符 1.实例:. 匹配 ...
- unity 捕鱼达人鱼群的移动
今天在做东西的时候,有个需求就是要做一群鱼在一定的范围内进行移动.当时候看到这个懵逼的,后来想想如果想让鱼在一定的范围内进行移动首先进行确定移动的范围,然后鱼在这个范围内应该游到哪里,然后怎样再加一些 ...
- CSS相关知识点记录
1.display 属性 display 属性规定元素应该生成的框的类型.可能的值.比如设置为block的时候,它就单独成为一行:设置为inline的时候,它就与前后的元素保持在一行内:设置为inli ...
最新文章
- [javascript] 看知乎学习js闭包
- Python入门100题 | 第019题
- Go 把类型放在变量名后面,是特立独行还是另有机密?
- spring框架入门day02
- 多用户在线人数监听(基于TomCat)
- python登录斗鱼_Python---20行代码爬取斗鱼平台房间数据(下)
- phpstudy下载安装简明教程(图文)
- 语音识别机器人课设Linux,机器人语音识别实验设计与实现
- 基于边缘特征的二值化阈值选取方法--ywp125
- 运行时设置数据库连接字符串
- QNX支持的BSP包QNX os supported board(ARM+MIPS+POWERPC+X86)
- python基础语法25_Python基础语法习题参考(0-9关)
- 用PS将GIF中的每一帧都输出为PNG
- android svg 线条动画教程,简单的SVG线条动画
- 充电站网络安全风险危及电动汽车普及
- cad上样条曲线上的点太多了_CAD样条曲线怎么能增加编辑点? CAD中如何按照
- 如何修改本机host地址
- 乘坐北京地铁费用计算
- 什么是FTP服务器?有哪些作用?
- enq:SQ-contention(SQ锁)测试