{"id":18881057,"url":"https://github.com/tylertemp/rhy_fall","last_synced_at":"2026-02-20T23:30:18.335Z","repository":{"id":86362601,"uuid":"570361902","full_name":"TylerTemp/rhy_fall","owner":"TylerTemp","description":"机试题目","archived":false,"fork":false,"pushed_at":"2022-11-28T10:48:03.000Z","size":58,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-12-31T03:26:14.487Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TylerTemp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-11-25T02:00:06.000Z","updated_at":"2022-11-25T02:00:52.000Z","dependencies_parsed_at":null,"dependency_job_id":"2175219f-ae2b-4646-a4b3-a14751b35ca1","html_url":"https://github.com/TylerTemp/rhy_fall","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TylerTemp%2Frhy_fall","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TylerTemp%2Frhy_fall/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TylerTemp%2Frhy_fall/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TylerTemp%2Frhy_fall/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TylerTemp","download_url":"https://codeload.github.com/TylerTemp/rhy_fall/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239850444,"owners_count":19707348,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T06:47:12.386Z","updated_at":"2026-02-20T23:30:18.304Z","avatar_url":"https://github.com/TylerTemp.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 机试题目 #\n\n## 要求说明\n\n*   `1.UI自适应` 为必做。若您无法完成本题目，则机试未通过。\n*   2-4 选择 **一个题目** 完成即可。注意：\n    *   若您只能完成2，则您的编程能力可能无法完全胜任本职位，我司无法给您这个职位对应的薪资。若您对本工作有兴趣，可以进行沟通，重新商议薪资。\n    *   若您能完成3且没有离题，则您可能可以胜任本职位。我司将根据完成情况进行进一步评估以决定。\n    *   若您能完成4且没有离题，我司将根据完成情况进行进一步评估，并与您进行沟通、确认意向等。\n*   为节省您的时间， 2-4中请 **只选择一道** 您认为自己能合理完成的题目完成。\n*   您可以将完成的项目（建议zip，或者链接）通过招聘软件聊天窗口发给我，或发送至： \u003ccontact@papomobi.com\u003e，邮件标题：`[应聘] Unity 您的姓名`\n\n## 题目说明 ##\n\n### 1. UI自适应（必做） ###\n\n将 Canvas 的 Screen Match Mode 改为 Match Width Or Height, 并将 Match 改为1（此时 Canvas 为横向适配）。\n完成以下内容，要求在不同宽度的屏幕下都自动成立（使用 Unity UI 的适配能力，不可以使用自己编写或第三方的脚本）：\n\n1. 创建5个Image方形（Unity自带的即可）\n2. 让这5个方形永远在屏幕底部横向排成一排\n3. 让这5个方形横向间距相同\n4. 当屏幕变宽时，5个方形宽度不变，间距变大，但依然保持间距相同\n5. 重新做一个1-3，当屏幕变宽时，5个方形宽度变大，间距不变\n\n### 2. 飞行球（可选） ###\n\n1.  在脚本中配置三个参数\n\n    ```c#\n    public int plantCount;\n    public float flyDuration;\n    public float stayDuration;\n    ```\n\n    三个参数可以在不同脚本中，但需要能让 Unity Editor Inspector 识别并编辑。\n\n2. 游戏启动时，在空间中随机 `plantCount` 个三维坐标（称为星球点），Inspector 配置时请将 `plantCount`\u003e=4。坐标上可以不放东西\n3. 玩家是一个球体。启动时总是在 `plantCount` 个星球点的随机某一个上\n4. 游戏开始后，玩家离开当前球体，以恒定的时间 `flyDuration`秒 移动到下一个随机的星球。\n5. 每次玩家登陆星球后，会停留 `stayDuration`秒，然后以`flyDuration`秒前往下一个随机星球\n6. 每次前往的下一个星球是随机的，但不得与当前、上次、上上次的星球相同\n7. 移动不可以使用DoTween，iTween等tweener动画库\n\n\n### 3. 飞行球 plus（可选） ###\n\n与 `2. 飞行球` 类似，但有以下区别：\n\n1. 球的运动轨迹必须为曲线。不得为折线，不得为直线。曲线的实现你可以选择第三方库，比如贝塞尔曲线库。注意：星球点的位置是依然是每次启动时随机的，因此你不能写死曲线路径\n2. 第4点，球的运动改为恒定的速度。如果你的曲线不适合计算曲线单位长度，允许一定程度的波动。`flyDuration` 改为 `flySpeed` 作为速度参数。\n3. 第7点，曲线可以使用第三方库。移动依然不允许使用任何 tweener 动画库。\n\n\u003c!-- ### UI文字滚动 ###\n\n以手机端为设计目标，实现一个文本展示框（不需要背景图），要求\n\n1. 该文本是一段文字\n2. 该文本可以是几个字（一行），可以是较多字（折行为多行）；但不会超过手机屏幕，不需要做滚动，最多折5行\n3. 该文本文字下方有类似下划线的图片做装饰，并有以下特点：\n   1. 当一行就能显示时，没有下划线\n   2. 当需要N行显示时，第一行到N-1都需要下划线图片，最后一行没有下划线\n4. 下划线必须是图片，不能是 Unity 自带的 Underline 样式\n5. 你可以通过自适配、UI MASK、脚本、插件等任意方式实现 --\u003e\n\n### 4. 下落式音游（可选） ###\n\nclone 本项目。请注意，本项目使用了 `git` 的 `lfs` 能力。你应该使用 `git`，本题目包含了对 `git` 能力的考查。注意：本项目中的音频文件 **没有** 损坏。\n\n项目说明：\n\n1.  `RawResources/Balls` 下面有红白两个球作为素材。\n2.  播放游戏时，`MusicManager.MusicPlaySample` 将播放音乐并不断更新音乐帧时间（Sample）。你应该认为这个时间是精确的。\n3.  游戏场景有标注“球的生成点”和“球的结束点”。如果看不到，请打开 Gizmos。\n4.  音乐有4拍，3拍轻，1拍重。`MusicManager.MusicPiece.RhythmSample` 属性标注了4个节拍的时间（`sample`）和类型（`isMain`）。\n5.  `MusicManager.TotalSamples` 是这首歌的总的Sample数\n\n题目说明：\n\n1.  请从生成点生成球，以`float _ballMoveSpeed`的速度匀速向下运动。当音乐刚好在节拍上时，球刚好运动到结束点。如果`isMain=True`，则这个球应为红球，否则为白球。\n2.  无论速度参数是快是慢，球都应该从生成点生成（因为不稳定误差，实际生成时应该在这个点或者离开了这个点些许距离），从结束点消失，且结束点匹配节拍。也就是说，当速度非常慢时，屏幕上应该能看到多个球。\n3.  请注意：你应该保证卡点，并避免任何的误差（因此你应该使用 `MusicManager.MusicPlaySample` 作为 `Update` 的时间驱动替代）。这些误差包括：\n    *   音频系统的不稳定性：音频可能在某一瞬间比`Time.time`快了或者慢了一点。（但是 `MusicManager.MusicPlaySample` 反馈的当前时间总是正确的）\n    *   帧率的不稳定性：玩家端的 `Update` 可能掉帧。`Update` 中的 `deltaTime` 并不能反映音频系统的时间差（反应的是帧率差）。如果玩家掉了3帧，那么下一帧的球应该位移了4帧的距离。\n    *   浮点数累加差异：`ball.transform.position = ball.transform.position + speed * deltaTime` 不被允许，因为 `Vector3` 的累加会逐渐造成差异。\n4.  tweener 动画库一般延迟不可控。不建议您使用 tweener 实现。如果使用，您需要阐述为何这个库能保证位移的精确性。\n5.  请完成这两种模式的一种或都完成：\n\n    *   [选其一] 因为第一拍时间较近，因此游戏开始时屏幕上可能没有球或者只有一个球；第一个球卡的点不一定是游戏的第一拍。\n    \n        参看示例视频： [no_preload.mp4](https://media.githubusercontent.com/media/TylerTemp/rhy_fall/master/no_preload.mp4)\n    \n    *   [选其一] 游戏的第一拍开始，每一拍都有球在结束点踩点。因此前面的几个球可能不是在生成点生成。\n\n        参看示例视频： [preload.mp4](https://github.com/TylerTemp/rhy_fall/blob/master/preload.mp4)\n\n注意：\n\n1.  你不能修改或继承 `Scripts/MusicManager.cs`， `Scripts/MusicPiece.cs` 中的代码和对象\n2.  你不能直接获取 `RawResouces/Music` 下面的对象\n3.  你只应该获取 `MusicManager` 这个组件（通过 Inspector 将这个对象添加到你的脚本字段的方式），并只访问 `MusicManager` 中的公共函数、变量\n4.  你可以随意使用、修改 `RawResources/Balls` 下面的任何内容\n5.  `BallManager` 是一个简单的框架，你可以在此脚本上进行修改，减少你的编程准备工作。你可以对该对象进行任何的修改，也可以添加更多的脚本或对象，或者自己重新写一个脚本，来完成本题目。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftylertemp%2Frhy_fall","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftylertemp%2Frhy_fall","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftylertemp%2Frhy_fall/lists"}