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