Rhy Fall
A technical assessment project containing four programming challenges for Unity developers: mandatory UI responsive design using Canvas auto-layout, and three optional gameplay implementations (orbital planet hopping, curved movement variant, and rhythm-based ball dropping). Designed to evaluate core competencies in UI systems, game logic, timing precision, and Git proficiency.
Unity Project
Built with Unity 2020.3.18f1 · download the source from GitHub

Dependencies (36)
README
机试题目
要求说明
1.UI自适应为必做。若您无法完成本题目,则机试未通过。- 2-4 选择 一个题目 完成即可。注意:
- 若您只能完成2,则您的编程能力可能无法完全胜任本职位,我司无法给您这个职位对应的薪资。若您对本工作有兴趣,可以进行沟通,重新商议薪资。
- 若您能完成3且没有离题,则您可能可以胜任本职位。我司将根据完成情况进行进一步评估以决定。
- 若您能完成4且没有离题,我司将根据完成情况进行进一步评估,并与您进行沟通、确认意向等。
- 为节省您的时间, 2-4中请 只选择一道 您认为自己能合理完成的题目完成。
- 您可以将完成的项目(建议zip,或者链接)通过招聘软件聊天窗口发给我,或发送至: contact@papomobi.com,邮件标题:
[应聘] Unity 您的姓名
题目说明
1. UI自适应(必做)
将 Canvas 的 Screen Match Mode 改为 Match Width Or Height, 并将 Match 改为1(此时 Canvas 为横向适配)。 完成以下内容,要求在不同宽度的屏幕下都自动成立(使用 Unity UI 的适配能力,不可以使用自己编写或第三方的脚本):
- 创建5个Image方形(Unity自带的即可)
- 让这5个方形永远在屏幕底部横向排成一排
- 让这5个方形横向间距相同
- 当屏幕变宽时,5个方形宽度不变,间距变大,但依然保持间距相同
- 重新做一个1-3,当屏幕变宽时,5个方形宽度变大,间距不变
2. 飞行球(可选)
在脚本中配置三个参数
public int plantCount; public float flyDuration; public float stayDuration;三个参数可以在不同脚本中,但需要能让 Unity Editor Inspector 识别并编辑。
游戏启动时,在空间中随机
plantCount个三维坐标(称为星球点),Inspector 配置时请将plantCount>=4。坐标上可以不放东西玩家是一个球体。启动时总是在
plantCount个星球点的随机某一个上游戏开始后,玩家离开当前球体,以恒定的时间
flyDuration秒 移动到下一个随机的星球。每次玩家登陆星球后,会停留
stayDuration秒,然后以flyDuration秒前往下一个随机星球每次前往的下一个星球是随机的,但不得与当前、上次、上上次的星球相同
移动不可以使用DoTween,iTween等tweener动画库
3. 飞行球 plus(可选)
与 2. 飞行球 类似,但有以下区别:
- 球的运动轨迹必须为曲线。不得为折线,不得为直线。曲线的实现你可以选择第三方库,比如贝塞尔曲线库。注意:星球点的位置是依然是每次启动时随机的,因此你不能写死曲线路径
- 第4点,球的运动改为恒定的速度。如果你的曲线不适合计算曲线单位长度,允许一定程度的波动。
flyDuration改为flySpeed作为速度参数。 - 第7点,曲线可以使用第三方库。移动依然不允许使用任何 tweener 动画库。
4. 下落式音游(可选)
clone 本项目。请注意,本项目使用了 git 的 lfs 能力。你应该使用 git,本题目包含了对 git 能力的考查。注意:本项目中的音频文件 没有 损坏。
项目说明:
RawResources/Balls下面有红白两个球作为素材。- 播放游戏时,
MusicManager.MusicPlaySample将播放音乐并不断更新音乐帧时间(Sample)。你应该认为这个时间是精确的。 - 游戏场景有标注“球的生成点”和“球的结束点”。如果看不到,请打开 Gizmos。
- 音乐有4拍,3拍轻,1拍重。
MusicManager.MusicPiece.RhythmSample属性标注了4个节拍的时间(sample)和类型(isMain)。 MusicManager.TotalSamples是这首歌的总的Sample数
题目说明:
请从生成点生成球,以
float _ballMoveSpeed的速度匀速向下运动。当音乐刚好在节拍上时,球刚好运动到结束点。如果isMain=True,则这个球应为红球,否则为白球。无论速度参数是快是慢,球都应该从生成点生成(因为不稳定误差,实际生成时应该在这个点或者离开了这个点些许距离),从结束点消失,且结束点匹配节拍。也就是说,当速度非常慢时,屏幕上应该能看到多个球。
请注意:你应该保证卡点,并避免任何的误差(因此你应该使用
MusicManager.MusicPlaySample作为Update的时间驱动替代)。这些误差包括:- 音频系统的不稳定性:音频可能在某一瞬间比
Time.time快了或者慢了一点。(但是MusicManager.MusicPlaySample反馈的当前时间总是正确的) - 帧率的不稳定性:玩家端的
Update可能掉帧。Update中的deltaTime并不能反映音频系统的时间差(反应的是帧率差)。如果玩家掉了3帧,那么下一帧的球应该位移了4帧的距离。 - 浮点数累加差异:
ball.transform.position = ball.transform.position + speed * deltaTime不被允许,因为Vector3的累加会逐渐造成差异。
- 音频系统的不稳定性:音频可能在某一瞬间比
tweener 动画库一般延迟不可控。不建议您使用 tweener 实现。如果使用,您需要阐述为何这个库能保证位移的精确性。
请完成这两种模式的一种或都完成:
[选其一] 因为第一拍时间较近,因此游戏开始时屏幕上可能没有球或者只有一个球;第一个球卡的点不一定是游戏的第一拍。
参看示例视频: no_preload.mp4
[选其一] 游戏的第一拍开始,每一拍都有球在结束点踩点。因此前面的几个球可能不是在生成点生成。
参看示例视频: preload.mp4
注意:
- 你不能修改或继承
Scripts/MusicManager.cs,Scripts/MusicPiece.cs中的代码和对象 - 你不能直接获取
RawResouces/Music下面的对象 - 你只应该获取
MusicManager这个组件(通过 Inspector 将这个对象添加到你的脚本字段的方式),并只访问MusicManager中的公共函数、变量 - 你可以随意使用、修改
RawResources/Balls下面的任何内容 BallManager是一个简单的框架,你可以在此脚本上进行修改,减少你的编程准备工作。你可以对该对象进行任何的修改,也可以添加更多的脚本或对象,或者自己重新写一个脚本,来完成本题目。
Comments
No comments yet. Be the first!
Sign in to join the conversation
Sign In