怎么制作一个游戏爆炸盒子制作教程?

我想做一个小制作,就是有个材料不知道怎么选
问题补充:是塑料棒好还是钢棒好,钢棒危险,比较重,但又很坚硬,塑料棒安全,比较轻,但又太轻了,麻烦各位帮我选一下
最佳回答:钢吧好一些坚硬塑料太软了
其他回答:
问题补充:是塑料棒好还是钢棒好,钢棒危险,比较重,但又很坚硬,塑料棒安全,比较轻,但又太轻了,麻烦各位帮我选一下
最佳回答:钢吧好一些坚硬塑料太软了
其他回答:
编辑:lianxueping
热点文章Hot article
精彩图文Hot article
CopyRight 2006-.All Rights Reserved. 京ICP备号-17当前位置:
&&&如何做好一个游戏的运营?技巧分享
如何做好一个游戏的运营?技巧分享
如何做好一个游戏的运营?游戏运营是开发商与玩家之间重要的桥梁,很容易做,但要做好却很难。从工作岗位上来看,游戏运营琐事繁多,可谓是一个苦逼,但又非常关键,不少刚刚入行的小伙伴都觉得摸不到门道,本文就给大家简单介绍一下游戏运营的一些基本知识,希望对大家有所帮助。
什么是游戏运营
从定义上,游戏运营是在游戏的整个生命周期里,把一款游戏推上线,有计划地实施产品运作策略和营销手段,使玩家不断了解游戏、入驻游戏并最终付费的过程,以达到提高游戏收入的目的。
游戏运营专员则是公司的一个岗位,负责产品预热、推产品上线、活动策划、数据分析、渠道运营、市场投放以及客服工作。
在实际工作中,一个游戏的游戏运营不仅能胜任日常流程式的工作,还必须达到以下目的:
1、延长产品生命周期,提高用户粘性。
根据产品生命周期与市场调研结果,制定版本计划。因为一线运营人员掌握了游戏现存的BUG、玩家反馈、数据报告,能清晰地了解产品所处的生命周期、竞争状况,从而制定延长产品生命周期的版本计划,不断推出新资料、新版本,提高版本体验,令用户保持持久的期待。同时,对已经流失的用户加以研究,了解流失的等级、关卡和原因,为游戏优化做准备。
2、润滑每个部门,减少游戏事故的发生。
运营部门是连接开发人员、渠道、市场、玩家的节点,每个节点发生问题,运营都要积极沟通、协调配合,以减少游戏事故的发生。例如BUG提交跟进与修正,活动效果跟踪与反馈、支付平台突发事件等等,积极主动的沟通是非常必要的。
3、提高游戏收入。
运营部是提升游戏收入的关键部门,例行事务不能衡量运营人员工作的好坏,游戏的月流水、总流水、arpu才是最关键的。有了收入,才能给各部门发工资,才能推进市场投放计划、开展各种线上线下活动;同时,高收入的手游在渠道排名越高、推荐位越靠前,导致雪球效应。
游戏运营工作职能的分类
游戏运营的工作非常庞杂琐碎,运营专员甚至被冠以&打杂&的头衔,不过根据职能所起的作用分为八个模块,具体如下:
1、活动策划
活动策划是游戏利润生成的关键职位,需要协调玩家、产品、KPI之间的关系。玩家是否买账关系活动效果的好坏,而产品本身是否支持活动进行则决定了活动能否开展,当然了,活动策划受雇于公司,老板有KPI的要求、短期或长期的计划,也需要考虑该活动带来的利润。
活动策划的职责是设计活动(线上线下)、统计分析活动效果并作出反馈。
2、数据分析
数据分析的前提是数据统计,即把目标区服、渠道一定周期内的游戏数据统计出来,包括登陆数、活跃数、活跃时段、留存率、付费率等。但统计数据并非最终目的,以现有数据分析玩家状况、提出版本及活动优化建议,才是数据分析员的本质工作。
3、渠道运营
即与各大市场的商务负责人取得联系,谈分成、排期、推荐计划,并推产品上线;在产品上线后,维护渠道论坛与专区,配合渠道做活动与分发礼包等。
4、媒体运营
从事媒体运营的员工称为媒介,是负责产品外部宣传、对产品形象负责的人员,根据产品不同测试阶段的要求,做外宣计划并执行。主要工作有软文撰写投稿、媒体礼包投放、推荐位预约、广告创意设计、制定软广投放计划并执行,主要对游戏的百度指数、渠道热度、产品形象负责。
5、市场推广
监控产品上线后各大市场的下载、登陆数据、市场评论,进行各项提升产品排名、市场热度及好评率的操作,如投放CPA、CPC、刷好评等。
6、事件管理
即处理游戏运营过程中的例行事务与突发事件,例如制定开服计划并通知渠道与运维,游戏维护提前通知、维护补偿的发放、日常数据异常的监控。
7、玩家管理
这是一向面对玩家的工作,但并不是像客服那样直接玩家打交道,而是根据玩家的付费率、付费金额、VIP等级、活跃等指标,进行VIP玩家管理,收集玩家的BUG建议并择优提交相关人员,跟进BUG解决的进度。制定充值返利的额度与折扣。
8、社区管理
社区是一个玩家聚集的地方,包括QQ群、贴吧、论坛、公会、游戏盒子等,玩家与玩家之间直接交流,往往也是玩家抱怨、建议以及问题出现最频繁的地方。一个好的社区管理员,能处理意见建议、平息玩家怨气、及时安抚,还能提高社区的活跃、做出社区的特色。比如UC的公会有公会群、社区以及QQ群,论坛的热度直接影响新游期待榜的排名。
工作流程及能力要求
以上对游戏运营的岗位职能做了全面的介绍,相信看客们已有比较全面的认识。下面阐述游戏运营的工作流程及各个岗位的能力要求。
工作流程:
游戏运营工作围绕游戏的所处的各个测试阶段(封测-内测-公测),以产品为中心,考虑测试阶段的目的,开展相应工作,这个流程不是线性的,而是环形的。后一个测试期是前一个测试期工作内容的复制及充实,唯一的区别是玩家数量的多少、需求的深浅。
所谓封测,是封闭式测试的简称,即选取少数玩家参与游戏的第一次面市。这部分玩家是在开发期通过游戏预热、IP优势而产生的种子用户,非常忠诚,往往成为第一批付费用户。
封测前期运营要做的事很多,商务洽谈合作分成、拉商务讨论组、准备游戏测试,建立游戏专用交流QQ群、贴吧、论坛,媒介外发软文、宣传游戏创意。
封测期一般是删档的,进行压力测试和游戏试水。关键任务是维护第一批玩家的口碑、保持游戏热度,看看DAU、留存、付费率等运营指标。封测数据对游戏在渠道与市场的位置非常重要,例如UC九游将根据封测数据,对游戏划分成三六九等,对评级为A+、S级以上的游戏配备完备的专区、论坛及宣传位置,即所谓的深度合作。
与封测的区别是对全体市场玩家开放下载,内测又分为删档内测与不删档内测。内测前期,媒体运营按广告投放计划,进行广告预热内测期游戏运营的工作基本走上了正轨,每个岗位每天都循序渐进地履行自己的职能。如渠道运营开始按期向渠道申请活动支持与推荐申请;市场推广进行硬广投放,活动策划开展大范围的活动(充值、消耗、活跃),数据分析计算周期性登陆、留存、付费数据&&
游戏公测前往往有版本更替,在活动模板、功能、UI上会有较大的调整,新一轮的产品外宣与市场投放又开始了,渠道排名靠前、曝光度高的游戏能有获得较好的下载量与付费。
公测1&&3个月内,游戏线上线下活动非常关键,玩家维护工作也非常冗杂,开服速度与版本更替更加频繁,因此是运营的黄金期,加班加点是常有的事,周末也要安排值班。
能力要求:
运营入门的门槛不高(大专以上),经验往往比学历更为重要,但互联网行业是一个更新换代极快的朝阳行业,如果不能在短期内充实提升专业素养,被淘汰或啃老本是在所难免的,因为运营岗也是人员流动较为频繁的岗位。
但不可否认的是,一个资深的运营是产品成功的关键,手游有短现、快速的特点,生命只在3个月到一年之间,因此手游的运营在短期内承担的责任很重,能吃苦、有耐心的、学习能力强的人比较适合这个岗位。
下面来谈谈胜任运营岗位有哪些能力要求。
1、快速学习并迅速掌握新知识的能力。
作为运营人员,需要丰富的游戏素养,了解市场主流游戏的运营模式,运营人员需要一定的游戏龄,至少深入玩2款游戏以上,但我们不是&玩&游戏,而是学习游戏。
另外,运营人员需要广博的知识素养与完备的市场信息,从各大游戏媒体、渠道公布的信息中提炼出重要的干货,时刻保持对比、研究的姿态,让信息在脑中汇成一条河,对整个市场形成比较清晰的认识。
2、流畅亲和的沟通技巧。
运营岗是连接开发者、渠道、玩家、老板之间的重要岗位,有效沟通非常重要。游戏功能优化、版本更新,需要与策划人员达成共识,策划通过下达需求统领技术人员开发、测试人员测试
渠道方负责的游戏很多,平均每个人至少5款以上,因此少说废话、直击重点是必要的;当需要向渠道方申请推荐位时,人际关系也起到重要作用,例如上线应用宝70%靠与商务之间的关系。运营岗位与玩家的沟通体现在各类公告、事件处理、VIP玩家服务上,单方交流较多,因此表达方式的谦恭有礼、不卑不亢、原则性非常重要。
3、超一流的软件操作能力。
运营工作需要依赖excel、word、PPT等办公软件的应用,这些软件人们常常用,但用得精的人比较少。运营人员需要制定简洁明了的版本计划、数据分析文件、软文撰写甚至网编工具,很多是重复性的工作,除了耐心之外,速度也很重要。老板让你一天之内把昨天全区全服的数据统计出来,多达几百张表格,熟练的人根本不用花多少时间整合,而把大部分时间花在分析数据上面。
网编工具、绘图软件,什么都能拿得起放得下,对你的工作大有裨益。
4、统筹视野,执行力强。
优秀的运营人员是不间断地主动发现问题并且执行力很强的人,具有全局视野,根据游戏的市场表现和所处的阶段调整运营策略。
比如活动策划,很多活动策划像挤牙膏一样,老板有KPI指标压力时才开始思考做什么类型的活动、周期持续多久,常常拍脑袋决定,没有通过数据分析与活动效果对比,这样做出来的活动不能称之为精品。控制折扣价与生命周期、玩家现有道具之间的关系,是一个活动策划应该时刻掌握的技能。
媒体运营并非整个生命周期内都要炒得热火朝天,当游戏处于衰退期,官网渐渐停止更新、客服淡出玩家视野,让一批玩家自然淘汰,媒介人员也无需再炒作了。
游戏运营的工作非常琐碎冗杂,以上仅介绍了各岗位的职能与能力要求,如需深入了解各大职能的细节与技巧,还需长期实践,每一个职能都能成为独立的专题。很多人羡慕游戏运营,甚至不惜从客服做起,其实每个岗位都有独特的优势,掌握更多技巧与知识,对工作必定有所裨益。已经成为运营、或者立志成为运营的人,都要在长期的实践经验中多多主动,做出流水在千万级的作品,运营总监的位置等着你!
以上就是如何做好一个游戏的运营介绍。更多app推广技巧请点击咨询或者关注公众号mogufenfa
更多内容请扫描下方二维码关注亿智蘑菇微信公众号
65人申请【CUEME智能内裤】
134人申请【CUEME智能文胸】
356人申请【幻响小吉 蓝牙音响】
364人申请【Insta360 Nano全景相机】
356人申请【异亮空气沁化器】
¥299【handjoy】杀戮之王 手游神器体验极速快感
¥89【Yolanda】好身材 是跟女神PK出来的
¥499【乐橙】省心又省力 看家护院360°度无死角
¥168【海偲】美好时光 时刻陪伴你
¥69【Turnip】智能插座 改变从真智能开始
微信添加"亿智蘑菇"获取我们的服务
微博添加"亿智蘑菇"获取我们的服务
下次自动登录
微信扫一扫 立即登录如何制作一个游戏软件?_百度知道查看: 1334|回复: 22
[新出炉]自绘我的世界游戏盒子1.0 UI设计预览版
阅读权限50
在线时间 小时
签到天数:17 天结帖率: (20/20)
是否带模块:
[新出炉]自绘我的世界游戏盒子1.0 UI设计预览版
花了一个下午做的,没什么使用功能。好看而已。还没有完成。。。。。。。。只是一个预览版
360截图52693.jpg (77.45 KB, 下载次数: 0)
20:52 上传
360截图22247.jpg (19.72 KB, 下载次数: 0)
20:52 上传
360截图34318.jpg (25.5 KB, 下载次数: 0)
20:52 上传
360截图13027.jpg (48.9 KB, 下载次数: 0)
20:52 上传
源码在此————————+——》
(799.39 KB, 下载次数: 51)
20:55 上传
点击文件名下载附件
下载积分: 精币 -1 枚
欢迎评分!!!!!!!!!!!!
请原谅我无法理解&
表示界面很渣 框架还可以。但是配色块 真心渣&
请原谅我跟不上UI潮流~ - -。。。&
请原谅我跟不上UI潮流~ -
感谢分享,很给力!~
奉上小小红包希望笑纳
阅读权限30
在线时间 小时
签到天数: 2 天结帖率: (16/16)
发表于 昨天&22:10
为什么不自绘?
阅读权限20
在线时间 小时
路过看看吧。。。
阅读权限10
在线时间 小时
谢谢分享,正好需要
阅读权限50
在线时间 小时
签到天数: 5 天
这配色请原理我不能追上你的脚步~
阅读权限10
在线时间 小时
下来学学。
阅读权限90
在线时间 小时
签到天数: 19 天结帖率: (5/5)
整体还可以. 但比例还需努力.
阅读权限10
在线时间 小时
签到天数: 2 天
需要加强啊,太粗糙了啊.
阅读权限50
在线时间 小时
签到天数: 18 天结帖率: (1/2)
要给画面 好好弄一下&&
阅读权限90
在线时间 小时
签到天数: 20 天结帖率: (7/7)
抓到海斌锅一只
QAQ被抓到惹
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
揭阳精易科技有限公司申明:我公司所有的培训课程版权归精易所有,任何人以任何方式翻录、盗版、破解本站培训课程,我们必将通过法律途径解决!
公司简介:揭阳市揭东区精易科技有限公司致力于易语言教学培训/易语言学习交流社区的建设与软件开发,多年来为中小企业编写过许许多多各式软件,并把多年积累的开发经验逐步录制成视频课程供学员学习,让学员全面系统化学习易语言编程,少走弯路,减少对相关技术的研究与摸索时间,从而加快了学习进度!
Powered byuntiy 一个逗比并且有无聊的游戏制作_无聊的盒子制作_词汇网
untiy 一个逗比并且有无聊的游戏制作
责任编辑:词汇网 发表时间: 1:30:13
先分享一波图,咋们还是看一波图吧。看完图了之后大家有什么感想,是不是觉得很简单啊,这么简单的游戏还做(感觉逗比刘真的是个逗比了啊,哎 我已经看不下去了)。这个美术很简单,总共就没有几张图。图中的,大家可以先想想一下 如果得到图中的一个圆圈。我们可以从美术哪儿得到啊(这逗比刘 问的啥问题,简直就是个大sb,其实逗比刘也可以画出来啊),大家如果观察仔细的话可以发现大圈和小圈他的那个环的宽度都是一样的,如果用美术得到这样一张图,当我们放大的时候,我们发现这个圈会变大的(但是逗比刘认为这个可以通过shader轻松的解决这个不和谐的问题)。这里我们还是用网格来绘制这样的一个圆环。那么还是从最简单的绘制一个圆环开始吧。第二张图就可以清晰的看到网格,我的思路是这样的。例如我们把一个圆平均分成200份,当然这只是假设,一个小的圆圈怎么可能分成200份呢,所以我们把一个圆的周长按0.2平分即可,首先我们建一个类:CircleBuilder,public class CircleBuilder{}当我们不需要继承由monobehavior所得到功能的时候,那么我们就没必要继承monobehavior了,先定义初始化方法:
private Material _shareM
private PlayerHandler _playerH
private GameObject _
private GameObject _
public void Intilized(Material mat,PlayerHandler player,GameObject obstacle,GameObject circle)
_shareMaterial =
_playerHandler =
_obstacle =
}接下来就开始写主要生成方法:
public GameObject CreateCirlceMesh(float circle,bool isaddColider,ref CircleData circleData)
GameObject ob = new GameObject("Child");
}然后我们定义内环和外环顶点数组,然后对其定义
GameObject ob = new GameObject("Child");
List inList = new List(150);
List outList = new List(150);
Vector3 p1, p2, p3, p4;
int nodeCount = (int)((circle * 2 * Mathf.PI) / 0.2f);nodecount表示圆环的节点个数,接着我们开始对2内环数组和外环数组对其赋值。
int nodeCount = (int)((circle * 2 * Mathf.PI) / 0.2f);
for (int i = 0; i < nodeC i++)
p1=(GetPosByIndex(circle, nodeCount, i));
p2=(GetPosByIndex(circle, nodeCount, (i + 1) % nodeCount));
p3=(GetPosByIndex(circle - 0.1f, nodeCount, (i + 1) % nodeCount));
p4=(GetPosByIndex(circle - 0.1f, nodeCount, i));
if (!outList.Contains(p1))
outList.Add(p1);
if (!outList.Contains(p2))
outList.Add(p2);
if (!inList.Contains(p4))
inList.Add(p4);
if (!inList.Contains(p3))
inList.Add(p3);
}内环和外环半径相差0.1,然后根据圆的公式求得圆上各个点。p1,p2外环上相邻的2个点,p3,p4内环上相邻的2个点。最后我们将一个整圆将它分成2个半圆(其实整个圆进行绘制也是可以的)
if (!inList.Contains(p3))
inList.Add(p3);
int q = inList.C
int p = q / 2;
List lefList=new List(80);
List rightList = new List(80);
for (int i = 0; i =0 ; i--)
lefList.Add(outList[i]);
for (int i = i = i--)
rightList.Add(outList[i]);
CreateChildGameObject(ob.transform,lefList,isaddColider);
CreateChildGameObject(ob.transform, rightList, isaddColider);
circleData.Intilized(q, ob.transform, _playerHandler.gameObject, circle);这只是我们做一个环的第一步,我们只有顶点,没有绘制顺序怎么可能绘制出一个圆呢。那么接下来添加CreateChildGameObject方法
private void CreateChildGameObject(Transform parent, List pointlist, bool isAdd)
GameObject tem = new GameObject("sb");
tem.tag = "Obstacle";
tem.AddComponent().mesh = ViewTool.GetObjMesh(pointlist);
var meshRenderer = tem.AddComponent();
meshRenderer.sharedMaterial = _shareM
tem.transform.SetParent(parent);
if (isAdd)
var colider = tem.AddComponent();
colider.points = V3ToV2(pointlist).ToArray();
private Vector3 GetPosByIndex(float circle, int nodecount, int index)
float angle = (360f / nodecount * index - 90) * Mathf.Deg2R
float x = Mathf.Cos(angle) *
float y = Mathf.Sin(angle) *
return new Vector3(x, y, 0);
private List V3ToV2(List points)
List point = new List();
for (int i = 0; i < points.C i++)
point.Add(new Vector2(points[i].x, points[i].y));
}我们还需要添加一个通过点得到网&#26684;的方法:GetObjMesh(List pointsList)所以需要贴出这一部分的代码。public static class ViewTool{
public static void ChangeMatColor(Material meshMaterial)
float r = Random.Range(0, 255);
float g = Random.Range(0, 255);
float b = Random.Range(0, 255);
float a = Random.Range(125, 255);
Color tempColor=new Color(r/255f,g/255f,b/255f,a/255f);
meshMaterial.DOColor(tempColor, 5.0f).OnComplete(delegate
meshMaterial.DOColor(new Color(0,0,0,1), 5.0f);
public static void RemoveView(GameObject ob)
for (int i = 0; i < ob.transform.childC i++)
var child = ob.transform.GetChild(i);
if (pareTag("Spike"))
Pools.RecyclePoolObj(child.gameObject);
Object.Destroy(ob);
public static float GetColorLength(Material shareMaterial)
Vector3 temp=new Vector3(1,0,0);
Color p = shareMaterial.
Vector3 endvalue=new Vector3(p.r,p.g,p.b);
return Vector3.Dot(endvalue, temp);
public static Mesh GetObjMesh(List pointsList)
Mesh curmesh=new Mesh();
int onepertwo = pointsList.Count/2;
List indictInts=new List();
for (int i = 0; i < i++)
indictInts.Add(i); indictInts.Add(2 * onepertwo - 2-i); indictInts.Add(2 * onepertwo - 1-i);
indictInts.Add(i); indictInts.Add(i+1); indictInts.Add(2 * onepertwo - 2-i);
curmesh.vertices = pointsList.ToArray();
curmesh.triangles = indictInts.ToArray();
}}一些基本的工作做完之后,我们就可以生成出一个圆了,这里我们的做法其实数据和视图是存在分离的,这里的视图就是我们用网&#26684;来生成这个圆环,同样我们也可以用其他的方式,例如直接用一张图。所以还得定义我们的圆环数据类,该数据的包含几个基本的属性,例如圆环的半径,圆环的所在的游戏实例及圆环节点个数及玩家所在的是内环还是外环,所以一个基本的类就构造出来了,玩家需要在环上移动,这个移动方式不是简单的圆周运动,如果是圆周运动的话那么球在大环上我们看起来移动的慢,在小环上移动的慢,这很显然是不和谐的,所以球在圆上做的是直线运动,只不过我们每帧都在指定球的运动的目标点罢了。所以这个基本的类应该具备2个功能就是痛过index索引得到一个在圆上的位置和痛过在圆上的位置得到一个索引。同样还得有一个最基本的方法了。using System.Collections.Gusing UnityEpublic class CircleData{
public Transform Parent { }
public ListType CurType { }
public int Count { }
public float Radius { }
public Vector3 NextVector3 { }
public Vector3 PreVector3 { }
private GameObject _
public Vector3 GetTargetPos(int index,ListType curType)
float offset = _player.GetComponent().
float scale = _player.transform.localScale.x;
float r = 0;
if (curType == ListType.In)
r = Radius - scale * offset-0.1f;
if (curType == ListType.Out)
r = Radius + scale *
return GetTargetPos(r,index);
private Vector3 GetTargetPos(float r,int index)
float x = Mathf.Cos(index * Mathf.PI / Count * 2 - Mathf.PI / 2) *
float y = Mathf.Sin(index * Mathf.PI / Count * 2 - Mathf.PI / 2) *
Vector3 temp = new Vector3(x, y, 0);
public int GetTargetIndex(Vector3 targetVector3,ListType listType)
float offset = _player.GetComponent().
float scale = _player.transform.localScale.x;
int min = 0, max = 0;
float r=0;
if (listType == ListType.In)
r = Radius - scale*offset - 0.1f;
if (listType == ListType.Out)
r = Radius + scale*
if (targetVector3.x >= 0 && targetVector3.y >= 0)
min = Count / 4 - 1;
max = Count / 4 + 1;
if (targetVector3.x >= 0 && targetVector3.y <= 0)
max = Count / 4 + 1;
if (targetVector3.x = 0)
min = Count / 2 + 1;
max = Count / 4 + 1;
if (targetVector3.x <= 0 && targetVector3.y <= 0)
min = Count / 4 * 3 + 1;
max = Count / 4 + 1;
for (int i = 0; i < i++)
Vector3 temp = GetTargetPos(r, (i + min) % Count);
float distance = Vector3.SqrMagnitude(temp - targetVector3);
if (distance < 0.05)
return i +
return 200;
public void
Intilized(int count,Transform parent,GameObject obj,float radius)
CurType=ListType.In;
}}我们还得必须添加几个枚举,要不然程序出报错了。public enum GameState{
FailOver,}public enum ListType{
Out}public enum LevelState{
ThreeState,
FourState,
FiveState,}public enum ColorType{
Red}这下应该不会出错了,当我们添加一个圆环所具备的基本数据的时候,我们就可以绘制出一个圆环了。如果我们需要绘制出很过个圆并且让这些圆无缝的连接在一起的时候,这时我们需要一个管理者来统一管理。作为一个管理类,他必须具备一些基本的功能例如添加一个圆环实例和删除一个圆环实例。同时还应该有一个基本的初始化方法。所以接着我们需要添加一个管理类了:public class CirclesManager{
private List _circleD
private List _circleO
private CircleBuilder _circleB
public int C
private PlayerHandler _
public CircleData CurCircleData
return _circleDatas[Curindex];
public void Intilized(Material mat, PlayerHandler player, GameObject obstacle,GameObject circle)
Curindex = 0;
_circleDatas=new List();
_circleObjects=new List(4);
for (int i = 0; i < 4; i++)
var temp=new CircleData();
_circleDatas.Add(temp);
_circleBuilder=new CircleBuilder();
_circleBuilder.Intilized(mat, player, obstacle, circle);
public void InitlizedCircleObj(int totalNum,List circleList)
for (int i = 0; i < totalN i++)
var circleData = _circleDatas[i];
GameObject ob = _circleBuilder.CreateCirlceMesh(circleList[i], false,ref circleData);
_circleObjects.Add(ob);
ob.transform.position = new Vector3(0, 0, 0);
float radius = _circleDatas[i].Radius + _circleDatas[i-1].Radius - 0.1f;
ob.transform.position = VectorHelpr.GetVector3ByDis(radius, _circleDatas[i - 1].Parent.position);
Vector3 dir = (ob.transform.position - _circleDatas[i - 1].Parent.position).
_circleDatas[i - 1].NextVector3 = dir * (_circleDatas[i - 1].Radius - 0.1f - _player.Skin)+
_circleDatas[i - 1].Parent.
_circleDatas[i].PreVector3 = -dir * (_circleDatas[i].Radius - _player.Skin - 0.1f) + _circleDatas[i].Parent.
private void AddCirlceToList(int num)
int count = _circleDatas.C
var preCircleData = _circleDatas[Curindex];
GameObject ob1 = _circleBuilder.CreateCirlceMesh(UnityEngine.Random.Range(1.5f, 2.7f), false, ref preCircleData);
int temp = C
Curindex++;
Curindex %= 4;
var curCircleData = _circleDatas[(Curindex + 2) % count];
float radius = curCircleData.Radius + preCircleData.Radius - 0.1f;
ob1.transform.position = VectorHelpr.GetVector3ByDis(radius, curCircleData.Parent.position);
Vector3 dir = (preCircleData.Parent.position - curCircleData.Parent.position).
curCircleData.NextVector3 = dir * (curCircleData.Radius - 0.1f - _player.Skin) +
curCircleData.Parent.
preCircleData.PreVector3 = -dir * (preCircleData.Radius - _player.Skin - 0.1f) + preCircleData.Parent.
_circleObjects[temp] = ob1;
_circleBuilder.AddObsToCircle(_circleDatas[(temp + 2) % count], num);
public void UpdateList(int num)
ViewTool.RemoveView(_circleObjects[Curindex]);
_circleObjects[Curindex]=
AddCirlceToList(num);
public void ClearCircleData()
_circleDatas.Clear();
for (int i = 0; i < _circleObjects.C i++)
Object.Destroy(_circleObjects[i]);
public void Reintilized(Action callAction)
bool isComplete =
for (int i = 0; i < _circleObjects.C i++)
_circleObjects[i].transform.localScale = Vector3.
_circleObjects[i].transform.DOScale(new Vector3(1, 1, 0), 1.0f).OnComplete(delegate
if (!isComplete)
isComplete =
callAction.Invoke();
}}管理类就只有添加,删除,因为删除和添加是一个前一个后进行的,所以我用一个UpdateList(int num)代替就行了,其他的都是基本初始化方法了。当我们游戏开始的时候,我们需要生成几个相连接的圆环,所以他应该还要定义一个方法就是初始化我们最开始游戏运行时的圆环数据和圆环实例。管理类需要用到几个工具方法。using Susing System.Collections.Gusing System.Lusing System.Tusing DG.Tusing UnityEpublic static class VectorHelpr{
public static Vector3 GetVector3ByDis(float radius,Vector3 pos)
float x = UnityEngine.Random.Range(radius/3, 2*radius/3);
float y = -Mathf.Sqrt(radius*radius-x*x);
if (pos.x > 0)
pos+ new Vector3(x,y,0);
public static bool JudgeGameOver(CircleData curCircleData,Transform player)
int cur = curCircleData.GetTargetIndex(curCircleData.NextVector3-curCircleData.Parent.position,ListType.In);
int nextindex = curCircleData.GetTargetIndex(player.position - curCircleData.Parent.position,ListType.Out);
ListType curType = curCircleData.CurT
if (curType == ListType.Out)
bool b1 = Mathf.Abs(nextindex - cur) = 0 && score 50&&score150&&score300&&score500&&score 4;
bool b2 = Mathf.Abs(index - maxindex) > 4;
return (b1 && b2);
public static List GetRandomInts(int min,int max,int num)
List endvalue=new List();
while (num>=1)
int temp = UnityEngine.Random.Range(min, max);
if (!endvalue.Contains(temp))
endvalue.Add(temp);
public static Vector3 GetPosByNormal(Vector3 start,Vector3 end,Vector3 temp,float pradius,float nradius)
Vector3 dir = (end - start).
Vector3 dir1 = (temp - start).
float cos = Vector3.Dot(dir, dir1);
float sin = Mathf.Sqrt(1 - cos * cos);
bool b = (dir.x*dir1.y - dir.y*dir1.x)>0;
Vector3 normal = (Quaternion.Euler(0, 0, 90) * dir).
float vdistance = pradius*
float hdistance =Mathf.Sqrt(nradius*nradius - vdistance*vdistance);
Vector3 endvalue = -dir*hdistance + (b?1:-1)*normal*
return endvalue+
}}工具类中的每个方法都很容易理解,我就不多讲,看方法的名字就知道方法是干什么的了。所以我们写代码的时候方法名字和方法体里面要干的事最好保持一致,这样才能让别人和自己以后回顾代码的时候更容易快速的理解。因为你的代码是写个人看的不是写个机器看的,如果你的一个类动不动就是上千行,那么阅读起来会是相当困难的。接下来就讲一下我们的主游戏逻辑类该怎么去写,首先我们的明白一个道理,应该尽量保证我们建的类在不需要继承monobehavior所带来的好处的时候那么我们就没必要去继承至于为什么我前面代码优化中讲到这点。所以我们主游戏逻辑类应该继承monobehavior,主要是因为我们需要在inspect面板上指定一些预设和ui。这个主游戏逻辑相当于&#20540;最高层的管理类,所以它的级别应该比较高了,所以常用的调用关系应该是它去调用别人而不是别人可以调用它,如果存在这方面的调用,例如主游戏逻辑中管理游戏的状态,假如我们的玩家死了的话。我们需要指定游戏结束,这里我们几种方法分别列举一下:1 我们可以用一种消息处理机制(这部分前面已经讲到) 2 我们可以使用接口,让主游戏逻辑类继承一个改变游戏状态的接口,然后我们在玩家类持有该接口的引用,同时我们在主游戏逻辑类中初始化玩家的时候给指定引用例如intilized(this)。3 最后一种方法就是单例了。我个人建议不采用,前面2种方法任选其一即可。好了贴出主游戏逻辑的代码吧using Susing UnityEusing System.Cusing System.Collections.Gusing DG.Tusing UnityEngine.EventSusing UnityEngine.UI;using Random = UnityEngine.Rpublic class GameLayer : MonoBehaviour, IGetCurGameState{
[SerializeField] private
Material _meshM
[SerializeField] private GameObject _
[SerializeField] private GameObject _
[SerializeField] private Camera _mainC
[SerializeField] private GameObject _
[SerializeField] private EventSystem eventS
[SerializeField] private GraphicRaycaster graphicR
[SerializeField] private PlayerHandler _playerH
[SerializeField] private UIManager _uiM
[SerializeField] private GameObject _
private float _
private GameState _curGameS
private int _score = 0;
private CirclesManager _
private bool _isReverse=
#region MonoBehavior Function
private PointerEventData _eventData=
private void Awake()
_eventData = new PointerEventData(eventSystem);
private void Start()
_curGameState = GameState.P
_manager=new CirclesManager();
_manager.Intilized(_meshMaterial, _playerHandler, _obstacle, _circle);
_manager.InitlizedCircleObj(4, new List() { 2, 1.5f, 2.5f, 1.0f });
_uiManager.Intilized(this);
_uiManager.AddListenerToButton();
MessagingSystem.Instance.AttachListener(typeof(GamstateMessage), this.HandleGameStateMsg);
_mainCamera.transform.DOMove(new Vector3(0, 0, -10), 2.0f);
_speed = (int)VectorHelpr.GetSpeedAndObsByScore(_score).x;
Pools.ManageRecyclePool(new ObjectPool() { Prefab = _obstacle, InstancesToPreallocate = 15});
private Vector3 _offsetVector3;
private bool _isMove =
private CircleData _curCircleD
private float _
private bool _isDown =
private void Update()
if (_curGameState == GameState.Playing)
_curCircleData = _manager.CurCircleD
if (Input.GetMouseButtonDown(0)&&_isDown)
if (CheckGuiRaycastObjects())
var temp = _curCircleData.GetTargetIndex(_curCircleData.NextVector3 - _curCircleData.Parent.position, ListType.In);
var temp1 = _curCircleData.GetTargetIndex(_playerHandler.transform.position - _curCircleData.Parent.position, ListType.In);
if (Mathf.Abs(temp - temp1) <= 1)
Vector3 prePos = _curCircleData.Parent.
float radiu = _curCircleData.R
_speed = (int) VectorHelpr.GetSpeedAndObsByScore(_score).x;
_manager.UpdateList((int)VectorHelpr.GetSpeedAndObsByScore(_score).y);
_isReverse = !_isR
_curCircleData = _manager.CurCircleD
var endvalue = VectorHelpr.GetPosByNormal(prePos, _curCircleData.Parent.position,
_playerHandler.transform.position, radiu- 0.2f, _curCircleData.Radius - 0.2f);
_index = _curCircleData.GetTargetIndex(endvalue - _curCircleData.Parent.position, ListType.In);
if (_isReverse)
_index %= _curCircleData.C
if (_index
0 && !_isDown)
if (_isMove)
MoveThisPlayer(_curCircleData);
if (VectorHelpr.JudgeGameOver(_curCircleData, _playerHandler.transform))
_curGameState = GameState.FailO
if (_curGameState == GameState.FailOver)
Instantiate(_explostion, _playerHandler.transform.position, Quaternion.identity);
Destroy(_playerHandler.gameObject);
_uiManager.PopUpFailItem(0, null);
_manager.ClearCircleData();
_curGameState = GameState.N
#endregion
#region Private Function
private int _index = 0;
private void MoveThisPlayer(CircleData curCircleData)
Vector3 targetPos = curCircleData.GetTargetPos(_index, curCircleData.CurType) + curCircleData.Parent.
Vector3 playerPos = _playerHandler.transform.
float delta = _speed*Time.smoothDeltaT
bool b = (Vector3.SqrMagnitude(targetPos - playerPos) < delta*delta);
if (_isReverse)
_index %= curCircleData.C
if (_index < 0)
_index += curCircleData.C
_playerHandler.transform.position += delta * (targetPos - playerPos).
private bool HandleGameStateMsg(BaseMessage curMessage)
GamstateMessage gamstateMessage = curMessage as GamstateM
if (gamstateMessage != null)
_curGameState = gamstateMessage.CurGameS
private bool CheckGuiRaycastObjects()
_eventData.pressPosition = Input.mouseP
_eventData.position = Input.mouseP
List list = new List();
graphicRaycaster.Raycast(_eventData, list);
for (int i = 0; i < list.C i++)
if (list[i].pareTag("Button"))
#endregion
public GameState GetGameState()
return _curGameS
public void ReIntilized()
GameObject ob = GameObject.Instantiate(_playerprefab, new Vector3(0,0.5f,0), Quaternion.identity)as GameO
if (ob != null) _playerHandler = ob.GetComponent();
_speed =VectorHelpr.GetSpeedByLevel(SpeedLevel.One);
_manager.Intilized(_meshMaterial, _playerHandler, _obstacle, _circle);
_manager.InitlizedCircleObj(4, new List() { 2, 1.5f, 2.5f, 1.0f });
_manager.Reintilized(delegate {_curGameState=GameState.P});
_isReverse =
_score = 0;
_index = 0;
_mainCamera.transform.position=new Vector3(0,0,-10);
VectorHelpr.CamerFloow(_mainCamera, _manager.CurCircleData.Parent.position);
}}方法体里面的东西比较简单没人什么复杂,就前面圆圈的生成麻烦一点了。如果还有什么不懂的可以qq和我讨论:/s/1i5uHuXf
上一集:没有了 下一集:
相关文章:&&&&&&&&
最新添加资讯
24小时热门资讯
附近好友搜索}

我要回帖

更多关于 怎么制作无聊的盒子 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信