项目展现

Github项目地址:Apple Pickergit
涉及知识
- 正投视图
- 3D场景内树与苹果的图层
- 记录最高分到本地
准备工做
模型制做:github
- 基本模型建立
- 树叶:sphere 拉伸为椭圆形,绿色材质球
- 树干:cylinde 修改成合适尺寸,棕色材质球
- 苹果:sphere 附加深红金属光泽球
- 篮筐:cube 修改成合适尺寸,黄色材质球
- 位置、层级关系
- 调整树叶树干的位置搭配,呈现简单树木形态
- 另设的空物体
AppleTree
包含着树叶和树干
- 标签、图层
- 新建标签Apple标记苹果物体
- 新建图层 AppleTree、Apple和Basket,后在Edit->Project Setting->Physics内取消Apple与AppleTree图层的碰撞。后修正对应物体图层
- 相机及预制体
- 调整主摄像机为正投影(Orthographic),移动到合适位置
- 建立苹果的预制体
游戏逻辑
- 苹果树:
- 每帧都以必定的速度移动,当碰到左右边界则转向,且在左右移动过程当中有几率改变运动方向
- 每必定时间间隔落下一个苹果
- 苹果:
- 从树叶位置实例化并落下(本例采用rigidbody重力)
- 与篮筐产生碰撞即被销毁
- 若篮筐未与其碰撞,则当苹果下落到必定距离就自动销毁
- 篮筐:
- 开局有3个篮筐,且均实例化出来
- 篮筐跟随鼠标限制在界面的x轴方向移动
- 篮筐用于接住苹果,与苹果碰撞后销毁苹果
- 当漏接苹果(也就是当苹果降低到自行销毁的底线时),罗筐数减小(至关于玩家的生命值)
- 机制:
- 开局,苹果树左右移动,生成苹果下落
- 玩家操做鼠标使篮筐左右移动
- 接到苹果时得分增长,超过历史分值就刷新记录
- 当没接到苹果时,篮筐数减小(生命值减小),且场景内还在下落中的苹果消失
- 当3个篮筐都没了,游戏结束,几秒后自动从新开局
代码相关
- AppleTree.cs:绑定于苹果树AppleTree
- Apple.cs:绑定于苹果Apple
- Basket.cs:绑定于篮筐Basket
- ApplePicker.cs:绑定于主摄像机;BasketPrefab 挂载Basket,EndUI 挂载Canvas->End
- HighScore.cs:绑定于 Canvas->HighScore
问题探讨
苹果树移动时几率转向问题:app
- 问题分析:在AppleTree.cs内,原计划实现每秒转向几率为
chanceToChangeDirecyions=0.02
(以下原版代码),可是发现,在FixedUpdate()内,每秒执行50次,也就会致使AppleTree平均每秒改变一次方向:(设几率为t) 50 x (t/1) = 1 ,所以须要修改。
- 解决方案:对随机数Random.value进行修改,即 Random.value/Time.deltaTime,此时每秒转向几率为: 50 x (t / (1/0.02)) = 50 x 0.02(t/1) = 0.02 ,至此解决问题
- 其余:但试验下来0.02几率太低,我已调为0.4,且速度为5
private void FixedUpdate()
{
/*-----原版-----*/
//随机改变运动方向,几率为 chanceToChangeDirecyions
if ((Random.value) < chanceToChangeDirecyions)
speed *= -1;
/*-----修正版-----*/
if ((Random.value / Time.deltaTime) < chanceToChangeDirecyions)
speed *= -1;
}
苹果下落被销毁就再也不生成问题:dom
- 问题分析:当第二个苹果还未实例化,第一个实例化的苹果就因降低越线被销毁或者被篮筐接住销毁,此刻场景内就再无Apple预制体,也就是说,AppleTree脚本 就失去对象applePrefab,没法再实例化产生苹果
- 解决方案:围绕保证场景内任意时刻存在一个applePrefab
- 调高树的高度(本例方案)
- 缩短实例化苹果的间隔
- 先隐藏再延时销毁苹果(理论可行,但感受大材小用)
参考