阶段性完成

This commit is contained in:
SoulliesOfficial
2026-07-25 13:27:53 -04:00
parent de70870682
commit a34461d31f
121 changed files with 7022 additions and 4111 deletions

View File

@@ -213,7 +213,7 @@ Material:
- _Dst: 10
- _DstBlend: 0
- _DstBlendAlpha: 0
- _EdgeValue: 0.43645233
- _EdgeValue: 0.25755936
- _EnvironmentReflections: 1
- _FNLfanxiangkaiguan: 0
- _Face: 1
@@ -258,7 +258,7 @@ Material:
- _Mask_scale: 1
- _Metallic: 0
- _OcclusionStrength: 1
- _Opacity: 0.5635477
- _Opacity: 0.74244064
- _Parallax: 0.005
- _Pass: 0
- _QueueOffset: 0

View File

@@ -0,0 +1,27 @@
<linker>
<assembly fullname="Unity.Addressables, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" preserve="all">
<type fullname="UnityEngine.AddressableAssets.Addressables" preserve="all" />
</assembly>
<assembly fullname="Unity.Localization, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
<type fullname="UnityEngine.Localization.Locale" preserve="all" />
<type fullname="UnityEngine.Localization.Tables.SharedTableData" preserve="all" />
<type fullname="UnityEngine.Localization.Tables.StringTable" preserve="all" />
<type fullname="UnityEngine.Localization.LocaleIdentifier" preserve="nothing" serialized="true" />
<type fullname="UnityEngine.Localization.Metadata.MetadataCollection" preserve="nothing" serialized="true" />
<type fullname="UnityEngine.Localization.Tables.TableEntryData" preserve="nothing" serialized="true" />
<type fullname="UnityEngine.Localization.Tables.DistributedUIDGenerator" preserve="nothing" serialized="true" />
<type fullname="UnityEngine.Localization.Tables.SharedTableData/SharedTableEntry" preserve="nothing" serialized="true" />
</assembly>
<assembly fullname="Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" preserve="all">
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider" preserve="all" />
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider" preserve="all" />
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider" preserve="all" />
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.SceneProvider" preserve="all" />
</assembly>
<assembly fullname="UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
<type fullname="UnityEngine.Object" preserve="all" />
</assembly>
<assembly fullname="YarnSpinner.Unity">
<type fullname="Yarn.Unity.UnityLocalization.LineMetadata" preserve="nothing" serialized="true" />
</assembly>
</linker>

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 544b0d2af4a8ed742864e96ca4de78c2
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -2,9 +2,13 @@ Key,Chinese (Simplified)(zh-CN),English(en),Chinese (Traditional)(zh-TW),Japanes
story_c0_refusal_rewind_title,"旅程在这里结束","The Journey Ends Here","旅程在這裡結束","旅はここで終わる","여기서 여정이 끝납니다","Hành trình kết thúc tại đây","การเดินทางสิ้นสุดลงที่นี่"
story_c0_refusal_rewind_body,"若希望返回选择之前,请点击时间轴上的“第五日 · 抉择”标记,并读取该时间点的存档。","To return to the point before your choice, select the “Day 5 · Decision” marker on the timeline and load that checkpoint.","若要回到做出選擇之前,請點擊時間軸上的「第五日 · 抉擇」標記,並讀取該時間點的存檔。","選択前に戻りたい場合は、タイムラインの「第5日・決断」マーカーを選び、その時点のセーブデータを読み込んでください。","선택하기 전으로 돌아가려면 타임라인의 “5일째 · 결단” 마커를 선택하고 해당 시점의 저장 데이터를 불러오세요.","Để quay lại trước khi đưa ra lựa chọn, hãy chọn mốc “Ngày thứ năm · Quyết định” trên dòng thời gian và tải bản lưu tại thời điểm đó.","หากต้องการกลับไปก่อนตัดสินใจ ให้เลือกเครื่องหมาย “วันที่ห้า · การตัดสินใจ” บนไทม์ไลน์ แล้วโหลดบันทึก ณ เวลานั้น"
system_unlock_song_title,"已解锁新歌曲!","New Song Unlocked!","已解鎖新歌曲!","新しい楽曲を解放しました!","새 곡이 해금되었습니다!","Đã mở khóa bài hát mới!","ปลดล็อกเพลงใหม่แล้ว!"
system_unlock_song_content,"你已解锁歌曲:{song_name}","You have unlocked: {song_name}","已解鎖歌曲:{song_name}","楽曲を解放しました:{song_name}","새 곡을 해금했습니다: {song_name}","Bạn đã mở khóa bài hát: {song_name}","คุณปลดล็อกเพลงแล้ว: {song_name}"
system_unlock_song_content,"你已解锁歌曲:{0}","You have unlocked: {0}","已解鎖歌曲:{0}","楽曲を解放しました:{0}","새 곡을 해금했습니다: {0}","Bạn đã mở khóa bài hát: {0}","คุณปลดล็อกเพลงแล้ว: {0}"
system_return_to_title_title,"返回标题","Return to Title","返回標題","タイトルへ戻る","타이틀로 돌아가기","Về màn hình tiêu đề","กลับสู่หน้าชื่อเรื่อง"
system_return_to_title_content,"你确定要返回标题页面吗?未保存的进度将丢失。","Are you sure you want to return to the title screen? Unsaved progress will be lost.","你確定要返回標題頁面嗎?未儲存的進度將會遺失。","タイトル画面に戻りますか?未保存の進行状況は失われます。","타이틀 화면으로 돌아가시겠습니까? 저장되지 않은 진행 상황은 사라집니다.","Bạn có chắc muốn quay lại màn hình tiêu đề không? Tiến trình chưa lưu sẽ bị mất.","คุณแน่ใจหรือไม่ว่าต้องการกลับสู่หน้าชื่อเรื่อง? ความคืบหน้าที่ยังไม่ได้บันทึกจะหายไป"
system_rollback_chapter_title,"重开本章节","Restart This Chapter","重新開始本章","この章をやり直す","이 챕터 다시 시작하기","Chơi lại chương này","เริ่มบทนี้ใหม่"
system_rollback_chapter_content,"将重置“{marker_name}”所在列及其之后的剧情选择与进度。歌曲成绩、解锁内容、设置和其它章节不会受到影响。","This resets the story choices and progress in the column containing “{marker_name}” and every column after it. Song records, unlocked content, settings, and other chapters are unaffected.","將重設「{marker_name}」所在欄位及其之後的劇情選擇與進度。歌曲成績、解鎖內容、設定及其他章節不受影響。","「{marker_name}」の列とそれ以降の物語選択・進行状況をリセットします。楽曲記録、解放済みコンテンツ、設定、ほかの章には影響しません。","“{marker_name}”이 있는 열과 그 이후의 스토리 선택 및 진행도를 초기화합니다. 곡 기록, 해금 콘텐츠, 설정 및 다른 챕터에는 영향을 주지 않습니다.","Thao tác này sẽ đặt lại các lựa chọn và tiến trình cốt truyện ở cột chứa “{marker_name}” cùng mọi cột phía sau. Kết quả bài hát, nội dung đã mở khóa, cài đặt và các chương khác không bị ảnh hưởng.","การดำเนินการนี้จะรีเซ็ตตัวเลือกและความคืบหน้าในคอลัมน์ที่มี “{marker_name}” รวมถึงคอลัมน์หลังจากนั้น ผลการเล่นเพลง เนื้อหาที่ปลดล็อก การตั้งค่า และบทอื่นจะไม่ถูกกระทบ"
system_rollback_chapter_content,"将重置“{0}”所在列及其之后的剧情选择与进度。歌曲成绩、解锁内容、设置和其它章节不会受到影响。","This resets the story choices and progress in the column containing “{0}” and every column after it. Song records, unlocked content, settings, and other chapters are unaffected.","將重設「{0}」所在欄位及其之後的劇情選擇與進度。歌曲成績、解鎖內容、設定及其他章節不受影響。","「{0}」の列とそれ以降の物語選択・進行状況をリセットします。楽曲記録、解放済みコンテンツ、設定、ほかの章には影響しません。","“{0}”이 있는 열과 그 이후의 스토리 선택 및 진행도를 초기화합니다. 곡 기록, 해금 콘텐츠, 설정 및 다른 챕터에는 영향을 주지 않습니다.","Thao tác này sẽ đặt lại các lựa chọn và tiến trình cốt truyện ở cột chứa “{0}” cùng mọi cột phía sau. Kết quả bài hát, nội dung đã mở khóa, cài đặt và các chương khác không bị ảnh hưởng.","การดำเนินการนี้จะรีเซ็ตตัวเลือกและความคืบหน้าในคอลัมน์ที่มี “{0}” รวมถึงคอลัมน์หลังจากนั้น ผลการเล่นเพลง เนื้อหาที่ปลดล็อก การตั้งค่า และบทอื่นจะไม่ถูกกระทบ"
system_rollback_confirm,"重开此时间点","Restart from This Point","從此時間點重開","この時点からやり直す","이 시점부터 다시 시작","Chơi lại từ thời điểm này","เริ่มใหม่จากจุดนี้"
system_tutorial_entry_title,教程,Tutorial,教學,チュートリアル,튜토리얼,Hướng dẫn,บทสอน
system_tutorial_entry_content,是否要游玩教程?,Would you like to play the tutorial?,是否要遊玩教學?,チュートリアルをプレイしますか?,튜토리얼을 플레이하시겠습니까?,Bạn có muốn chơi hướng dẫn không?,ต้องการเล่นบทสอนไหม?
system_tutorial_enter,游玩教程,Play Tutorial,遊玩教學,チュートリアルをプレイ,튜토리얼 플레이,Chơi hướng dẫn,เล่นบทสอน
system_tutorial_skip,跳过教程,Skip Tutorial,跳過教學,チュートリアルをスキップ,튜토리얼 건너뛰기,Bỏ qua hướng dẫn,ข้ามบทสอน
1 Key Chinese (Simplified)(zh-CN) English(en) Chinese (Traditional)(zh-TW) Japanese(ja) Korean(ko) Vietnamese (Vietnam)(vi-VN) Thai(th)
2 story_c0_refusal_rewind_title 旅程在这里结束 The Journey Ends Here 旅程在這裡結束 旅はここで終わる 여기서 여정이 끝납니다 Hành trình kết thúc tại đây การเดินทางสิ้นสุดลงที่นี่
3 story_c0_refusal_rewind_body 若希望返回选择之前,请点击时间轴上的“第五日 · 抉择”标记,并读取该时间点的存档。 To return to the point before your choice, select the “Day 5 · Decision” marker on the timeline and load that checkpoint. 若要回到做出選擇之前,請點擊時間軸上的「第五日 · 抉擇」標記,並讀取該時間點的存檔。 選択前に戻りたい場合は、タイムラインの「第5日・決断」マーカーを選び、その時点のセーブデータを読み込んでください。 선택하기 전으로 돌아가려면 타임라인의 “5일째 · 결단” 마커를 선택하고 해당 시점의 저장 데이터를 불러오세요. Để quay lại trước khi đưa ra lựa chọn, hãy chọn mốc “Ngày thứ năm · Quyết định” trên dòng thời gian và tải bản lưu tại thời điểm đó. หากต้องการกลับไปก่อนตัดสินใจ ให้เลือกเครื่องหมาย “วันที่ห้า · การตัดสินใจ” บนไทม์ไลน์ แล้วโหลดบันทึก ณ เวลานั้น
4 system_unlock_song_title 已解锁新歌曲! New Song Unlocked! 已解鎖新歌曲! 新しい楽曲を解放しました! 새 곡이 해금되었습니다! Đã mở khóa bài hát mới! ปลดล็อกเพลงใหม่แล้ว!
5 system_unlock_song_content 你已解锁歌曲:{song_name} 你已解锁歌曲:{0} You have unlocked: {song_name} You have unlocked: {0} 已解鎖歌曲:{song_name} 已解鎖歌曲:{0} 楽曲を解放しました:{song_name} 楽曲を解放しました:{0} 새 곡을 해금했습니다: {song_name} 새 곡을 해금했습니다: {0} Bạn đã mở khóa bài hát: {song_name} Bạn đã mở khóa bài hát: {0} คุณปลดล็อกเพลงแล้ว: {song_name} คุณปลดล็อกเพลงแล้ว: {0}
6 system_return_to_title_title 返回标题 Return to Title 返回標題 タイトルへ戻る 타이틀로 돌아가기 Về màn hình tiêu đề กลับสู่หน้าชื่อเรื่อง
7 system_return_to_title_content 你确定要返回标题页面吗?未保存的进度将丢失。 Are you sure you want to return to the title screen? Unsaved progress will be lost. 你確定要返回標題頁面嗎?未儲存的進度將會遺失。 タイトル画面に戻りますか?未保存の進行状況は失われます。 타이틀 화면으로 돌아가시겠습니까? 저장되지 않은 진행 상황은 사라집니다. Bạn có chắc muốn quay lại màn hình tiêu đề không? Tiến trình chưa lưu sẽ bị mất. คุณแน่ใจหรือไม่ว่าต้องการกลับสู่หน้าชื่อเรื่อง? ความคืบหน้าที่ยังไม่ได้บันทึกจะหายไป
8 system_rollback_chapter_title 重开本章节 Restart This Chapter 重新開始本章 この章をやり直す 이 챕터 다시 시작하기 Chơi lại chương này เริ่มบทนี้ใหม่
9 system_rollback_chapter_content 将重置“{marker_name}”所在列及其之后的剧情选择与进度。歌曲成绩、解锁内容、设置和其它章节不会受到影响。 将重置“{0}”所在列及其之后的剧情选择与进度。歌曲成绩、解锁内容、设置和其它章节不会受到影响。 This resets the story choices and progress in the column containing “{marker_name}” and every column after it. Song records, unlocked content, settings, and other chapters are unaffected. This resets the story choices and progress in the column containing “{0}” and every column after it. Song records, unlocked content, settings, and other chapters are unaffected. 將重設「{marker_name}」所在欄位及其之後的劇情選擇與進度。歌曲成績、解鎖內容、設定及其他章節不受影響。 將重設「{0}」所在欄位及其之後的劇情選擇與進度。歌曲成績、解鎖內容、設定及其他章節不受影響。 「{marker_name}」の列とそれ以降の物語選択・進行状況をリセットします。楽曲記録、解放済みコンテンツ、設定、ほかの章には影響しません。 「{0}」の列とそれ以降の物語選択・進行状況をリセットします。楽曲記録、解放済みコンテンツ、設定、ほかの章には影響しません。 “{marker_name}”이 있는 열과 그 이후의 스토리 선택 및 진행도를 초기화합니다. 곡 기록, 해금 콘텐츠, 설정 및 다른 챕터에는 영향을 주지 않습니다. “{0}”이 있는 열과 그 이후의 스토리 선택 및 진행도를 초기화합니다. 곡 기록, 해금 콘텐츠, 설정 및 다른 챕터에는 영향을 주지 않습니다. Thao tác này sẽ đặt lại các lựa chọn và tiến trình cốt truyện ở cột chứa “{marker_name}” cùng mọi cột phía sau. Kết quả bài hát, nội dung đã mở khóa, cài đặt và các chương khác không bị ảnh hưởng. Thao tác này sẽ đặt lại các lựa chọn và tiến trình cốt truyện ở cột chứa “{0}” cùng mọi cột phía sau. Kết quả bài hát, nội dung đã mở khóa, cài đặt và các chương khác không bị ảnh hưởng. การดำเนินการนี้จะรีเซ็ตตัวเลือกและความคืบหน้าในคอลัมน์ที่มี “{marker_name}” รวมถึงคอลัมน์หลังจากนั้น ผลการเล่นเพลง เนื้อหาที่ปลดล็อก การตั้งค่า และบทอื่นจะไม่ถูกกระทบ การดำเนินการนี้จะรีเซ็ตตัวเลือกและความคืบหน้าในคอลัมน์ที่มี “{0}” รวมถึงคอลัมน์หลังจากนั้น ผลการเล่นเพลง เนื้อหาที่ปลดล็อก การตั้งค่า และบทอื่นจะไม่ถูกกระทบ
10 system_rollback_confirm 重开此时间点 Restart from This Point 從此時間點重開 この時点からやり直す 이 시점부터 다시 시작 Chơi lại từ thời điểm này เริ่มใหม่จากจุดนี้
11 system_tutorial_entry_title 教程 Tutorial 教學 チュートリアル 튜토리얼 Hướng dẫn บทสอน
12 system_tutorial_entry_content 是否要游玩教程? Would you like to play the tutorial? 是否要遊玩教學? チュートリアルをプレイしますか? 튜토리얼을 플레이하시겠습니까? Bạn có muốn chơi hướng dẫn không? ต้องการเล่นบทสอนไหม?
13 system_tutorial_enter 游玩教程 Play Tutorial 遊玩教學 チュートリアルをプレイ 튜토리얼 플레이 Chơi hướng dẫn เล่นบทสอน
14 system_tutorial_skip 跳过教程 Skip Tutorial 跳過教學 チュートリアルをスキップ 튜토리얼 건너뛰기 Bỏ qua hướng dẫn ข้ามบทสอน

View File

@@ -3,4 +3,14 @@ chapter0_song_drowning_in_a_moment_name,Drowning in a Moment,Drowning in a Momen
chapter0_song_world_for_white_lies_name,World for White Lies,World for White Lies,World for White Lies,World for White Lies,World for White Lies,World for White Lies,World for White Lies
chapter0_song_alunite_cas_name,Alunite Cas,Alunite Cas,Alunite Cas,Alunite Cas,Alunite Cas,Alunite Cas,Alunite Cas
chapter0_timeline_contract_decision,第五日 · 抉择,Day 5 · Decision,第五日 · 抉擇,第5日・決断,5일째 · 결단,Ngày thứ năm · Quyết định,วันที่ห้า · การตัดสินใจ
chapter0_text_private_briefing_title,秘密会谈,Private Briefing,私下會談,非公開会談,비공개 면담,Cuộc gặp riêng,การหารือเป็นการส่วนตัว
chapter0_text_home_deliberation_title,五日思量,Five Days of Deliberation,五日思量,五日間の熟考,닷새의 숙고,Năm ngày suy ngẫm,ห้าวันแห่งการไตร่ตรอง
chapter0_text_contract_decision_title,契约之前,Before the Contract,契約之前,契約の前,계약을 앞두고,Trước khế ước,ก่อนพันธสัญญา
chapter0_text_public_disclosure_title,公共说明,Public Statement,公開說明,公開説明,공개 발표,Công bố công khai,แถลงการณ์สาธารณะ
chapter0_text_refusal_ending_title,拒绝之后,After Refusal,拒絕之後,拒絶のあと,거절한 뒤,Sau lời từ chối,หลังการปฏิเสธ
chapter0_text_old_life_preparation_title,日常仍在,Ordinary Life Continues,日常依舊,日常は続く,일상은 계속된다,Cuộc sống thường ngày vẫn tiếp diễn,ชีวิตประจำวันยังคงดำเนินต่อไป
chapter0_text_departure_to_asteria_title,启程前往阿斯特里亚,Departure for Asteria,啟程前往阿斯特里亞,アステリアへの出発,아스테리아로의 출발,Khởi hành đến Asteria,ออกเดินทางสู่อัสเทเรีย
chapter0_text_ocean_heart_title,大洋之心,Heart of the Ocean,大洋之心,大洋の心臓,대양의 심장,Trái tim Đại Dương,หัวใจแห่งมหาสมุทร
chapter0_text_underground_city_title,地下都市,Underground City,地下都市,地下都市,지하 도시,Thành phố ngầm,นครใต้ดิน
chapter0_text_great_library_title,大图书馆,Great Library,大圖書館,大図書館,대도서관,Đại Thư viện,มหาหอสมุด
chapter0_tutorial_name,教程,Tutorial,教學,チュートリアル,튜토리얼,Hướng dẫn,บทช่วยสอน
1 Key Chinese (Simplified)(zh-CN) English(en) Chinese (Traditional)(zh-TW) Japanese(ja) Korean(ko) Vietnamese (Vietnam)(vi-VN) Thai(th)
3 chapter0_song_world_for_white_lies_name World for White Lies World for White Lies World for White Lies World for White Lies World for White Lies World for White Lies World for White Lies
4 chapter0_song_alunite_cas_name Alunite Cas Alunite Cas Alunite Cas Alunite Cas Alunite Cas Alunite Cas Alunite Cas
5 chapter0_timeline_contract_decision 第五日 · 抉择 Day 5 · Decision 第五日 · 抉擇 第5日・決断 5일째 · 결단 Ngày thứ năm · Quyết định วันที่ห้า · การตัดสินใจ
6 chapter0_text_private_briefing_title 秘密会谈 Private Briefing 私下會談 非公開会談 비공개 면담 Cuộc gặp riêng การหารือเป็นการส่วนตัว
7 chapter0_text_home_deliberation_title 五日思量 Five Days of Deliberation 五日思量 五日間の熟考 닷새의 숙고 Năm ngày suy ngẫm ห้าวันแห่งการไตร่ตรอง
8 chapter0_text_contract_decision_title 契约之前 Before the Contract 契約之前 契約の前 계약을 앞두고 Trước khế ước ก่อนพันธสัญญา
9 chapter0_text_public_disclosure_title 公共说明 Public Statement 公開說明 公開説明 공개 발표 Công bố công khai แถลงการณ์สาธารณะ
10 chapter0_text_refusal_ending_title 拒绝之后 After Refusal 拒絕之後 拒絶のあと 거절한 뒤 Sau lời từ chối หลังการปฏิเสธ
11 chapter0_text_old_life_preparation_title 日常仍在 Ordinary Life Continues 日常依舊 日常は続く 일상은 계속된다 Cuộc sống thường ngày vẫn tiếp diễn ชีวิตประจำวันยังคงดำเนินต่อไป
12 chapter0_text_departure_to_asteria_title 启程前往阿斯特里亚 Departure for Asteria 啟程前往阿斯特里亞 アステリアへの出発 아스테리아로의 출발 Khởi hành đến Asteria ออกเดินทางสู่อัสเทเรีย
13 chapter0_text_ocean_heart_title 大洋之心 Heart of the Ocean 大洋之心 大洋の心臓 대양의 심장 Trái tim Đại Dương หัวใจแห่งมหาสมุทร
14 chapter0_text_underground_city_title 地下都市 Underground City 地下都市 地下都市 지하 도시 Thành phố ngầm นครใต้ดิน
15 chapter0_text_great_library_title 大图书馆 Great Library 大圖書館 大図書館 대도서관 Đại Thư viện มหาหอสมุด
16 chapter0_tutorial_name 教程 Tutorial 教學 チュートリアル 튜토리얼 Hướng dẫn บทช่วยสอน

File diff suppressed because it is too large Load Diff

View File

@@ -11,3 +11,111 @@ ui_common_cancel,取消,Cancel,取消,キャンセル,취소,Hủy,ยกเล
ui_gameplay_pause_resume,继续游戏,Resume,繼續遊戲,ゲームを再開,게임 계속하기,Tiếp tục,เล่นต่อ
ui_gameplay_pause_settings,游戏设置,Settings,遊戲設定,設定,설정,Cài đặt,การตั้งค่า
ui_gameplay_pause_return_to_menu,返回标题,Return to Title,返回標題,タイトルへ戻る,타이틀로 돌아가기,Về màn hình tiêu đề,กลับสู่หน้าชื่อเรื่อง
ui_common_back,返回,Back,返回,戻る,뒤로,Quay lại,กลับ
ui_common_on,,On,,オン,켜기,Bật,เปิด
ui_common_off,,Off,,オフ,끄기,Tắt,ปิด
ui_settings_title,设置,Settings,設定,設定,설정,Cài đặt,การตั้งค่า
ui_settings_category_audio,音频,Audio,音效,オーディオ,오디오,Âm thanh,เสียง
ui_settings_category_graphics,画面,Graphics,圖像,グラフィック,그래픽,Đồ họa,กราฟิก
ui_settings_category_gameplay,游戏,Gameplay,遊玩,ゲームプレイ,게임플레이,Lối chơi,เกมเพลย์
ui_settings_category_key_bindings,键位绑定,Key Bindings,按鍵綁定,キー設定,키 바인딩,Gán phím,การกำหนดปุ่ม
ui_settings_category_debug,调试,Debug,偵錯,デバッグ,디버그,Gỡ lỗi,ดีบัก
ui_settings_master_volume_title,主音量,Master Volume,主音量,マスター音量,마스터 볼륨,Âm lượng tổng,ระดับเสียงหลัก
ui_settings_master_volume_description,调整游戏中所有声音的总音量。,Adjusts the volume of all game audio.,調整遊戲中所有聲音的總音量。,ゲーム内のすべての音声の音量を調整します。,게임 내 모든 사운드의 전체 볼륨을 조절합니다。,Điều chỉnh âm lượng của toàn bộ âm thanh trong game.,ปรับระดับเสียงรวมของเสียงทั้งหมดในเกม
ui_settings_music_volume_title,音乐音量,Music Volume,音樂音量,音楽音量,음악 볼륨,Âm lượng nhạc,ระดับเสียงเพลง
ui_settings_music_volume_description,调整音乐的音量。,Adjusts music volume.,調整音樂的音量。,音楽の音量を調整します。,음악 볼륨을 조절합니다。,Điều chỉnh âm lượng nhạc.,ปรับระดับเสียงเพลง
ui_settings_sfx_volume_title,音效音量,Sound Effects Volume,音效音量,効果音音量,효과음 볼륨,Âm lượng hiệu ứng âm thanh,ระดับเสียงเอฟเฟกต์
ui_settings_sfx_volume_description,调整游戏音效的音量。,Adjusts sound effect volume.,調整遊戲音效的音量。,効果音の音量を調整します。,효과음 볼륨을 조절합니다。,Điều chỉnh âm lượng hiệu ứng âm thanh.,ปรับระดับเสียงเอฟเฟกต์
ui_settings_ui_volume_title,UI 音量,UI Volume,UI 音量,UI音量,UI 볼륨,Âm lượng UI,ระดับเสียง UI
ui_settings_ui_volume_description,调整界面操作音效的音量。,Adjusts interface sound volume.,調整介面操作音效的音量。,UI操作音の音量を調整します。,인터페이스 효과음 볼륨을 조절합니다。,Điều chỉnh âm lượng âm thanh giao diện.,ปรับระดับเสียงของอินเทอร์เฟซ
ui_settings_ingame_audio_effects_title,游戏内声音特效,In-Game Audio Effects,遊戲內聲音特效,ゲーム内音響エフェクト,게임 내 오디오 효과,Hiệu ứng âm thanh trong màn chơi,เอฟเฟกต์เสียงระหว่างเล่น
ui_settings_ingame_audio_effects_description,启用游戏中的高通、低通等声音滤波效果。,Enables gameplay audio effects such as high-pass and low-pass filters.,啟用遊戲中的高通、低通等聲音濾波效果。,ハイパス・ローパスなどのゲーム内音響フィルターを有効にします。,하이패스와 로우패스 등의 게임 내 오디오 필터 효과를 켭니다。,Bật các hiệu ứng âm thanh trong màn chơi như bộ lọc thông cao và thông thấp.,เปิดใช้เอฟเฟกต์ตัวกรองเสียงระหว่างเล่น เช่น ไฮพาสและโลว์พาส
ui_settings_quality_preset_title,画质预设,Quality Preset,畫質預設,画質プリセット,그래픽 프리셋,Thiết lập chất lượng,ค่าที่ตั้งไว้ของคุณภาพ
ui_settings_quality_preset_description,选择整体渲染质量预设。,Selects the overall rendering quality preset.,選擇整體渲染品質預設。,全体的なレンダリング品質のプリセットを選択します。,전체 렌더링 품질 프리셋을 선택합니다。,Chọn thiết lập sẵn cho chất lượng hiển thị tổng thể.,เลือกค่าที่ตั้งไว้ของคุณภาพการเรนเดอร์โดยรวม
ui_settings_render_scale_title,渲染比例,Render Scale,渲染比例,レンダリングスケール,렌더 스케일,Tỷ lệ dựng hình,สเกลการเรนเดอร์
ui_settings_render_scale_description,调整内部渲染分辨率;降低该值可提升性能。,Adjusts internal render resolution. Lower values improve performance.,調整內部渲染解析度;降低此值可提升效能。,内部レンダリング解像度を調整します。低くすると性能が向上します。,내부 렌더링 해상도를 조절합니다. 낮출수록 성능이 향상됩니다。,Điều chỉnh độ phân giải dựng hình nội bộ. Giá trị thấp hơn giúp cải thiện hiệu năng.,ปรับความละเอียดการเรนเดอร์ภายใน ค่าที่ต่ำลงช่วยเพิ่มประสิทธิภาพ
ui_settings_frame_limit_title,帧率上限,Frame Limit,幀率上限,フレームレート上限,프레임 제한,Giới hạn khung hình,ขีดจำกัดเฟรมเรต
ui_settings_frame_limit_description,设置最高帧率;降低该值可减轻设备负载。,Sets the maximum frame rate. Lower values reduce device load.,設定最高幀率;降低此值可減輕裝置負載。,最大フレームレートを設定します。低くすると端末負荷を下げられます。,최대 프레임률을 설정합니다. 낮출수록 기기 부하가 줄어듭니다。,Đặt tốc độ khung hình tối đa. Giá trị thấp hơn giảm tải cho thiết bị.,ตั้งค่าเฟรมเรตสูงสุด ค่าที่ต่ำลงช่วยลดภาระของอุปกรณ์
ui_settings_post_processing_title,后处理,Post Processing,後處理,ポストプロセス,후처리,Hậu xử lý,โพสต์โปรเซส
ui_settings_post_processing_description,启用所有相机后处理效果。,Enables all camera post-processing effects.,啟用所有相機後處理效果。,すべてのカメラポストプロセス効果を有効にします。,모든 카메라 후처리 효과를 켭니다。,Bật toàn bộ hiệu ứng hậu xử lý của camera.,เปิดใช้เอฟเฟกต์โพสต์โปรเซสของกล้องทั้งหมด
ui_settings_bloom_quality_title,Bloom 质量,Bloom Quality,Bloom 品質,ブルーム品質,블룸 품질,Chất lượng Bloom,คุณภาพบลูม
ui_settings_bloom_quality_description,设置 Bloom 质量;仅在启用后处理时生效。,Sets Bloom quality. Only takes effect while post-processing is enabled.,設定 Bloom 品質;僅在啟用後處理時生效。,ブルーム品質を設定します。ポストプロセス有効時のみ反映されます。,블룸 품질을 설정합니다. 후처리가 켜져 있을 때만 적용됩니다。,Đặt chất lượng Bloom. Chỉ có hiệu lực khi hậu xử lý được bật.,ตั้งค่าคุณภาพ Bloom มีผลเมื่อเปิดโพสต์โปรเซสเท่านั้น
ui_settings_vfx_quality_title,VFX 质量,VFX Quality,VFX 品質,VFX品質,VFX 품질,Chất lượng VFX,คุณภาพ VFX
ui_settings_vfx_quality_description,设置音符和演出特效的质量等级。,Sets quality levels for Notes and performance effects.,設定音符和演出特效的品質等級。,ノーツと演出エフェクトの品質を設定します。,노트와 연출 효과의 품질 단계를 설정합니다。,Đặt mức chất lượng cho Note và hiệu ứng trình diễn.,ตั้งระดับคุณภาพของโน้ตและเอฟเฟกต์การแสดง
ui_settings_vsync_title,垂直同步,VSync,垂直同步,垂直同期,수직 동기화,Đồng bộ dọc,ซิงก์แนวตั้ง
ui_settings_vsync_description,使帧输出与显示器刷新率同步;仅 PC 生效。,Synchronizes frame output with the display refresh rate. PC only.,使幀輸出與螢幕更新率同步;僅 PC 生效。,フレーム出力をディスプレイのリフレッシュレートに同期します。PCのみ。,프레임 출력을 디스플레이 주사율과 동기화합니다. PC 전용입니다。,Đồng bộ khung hình với tần số quét màn hình. Chỉ trên PC.,ซิงก์การแสดงผลเฟรมกับอัตรารีเฟรชของจอ ใช้ได้บน PC เท่านั้น
ui_settings_display_mode_title,显示模式,Display Mode,顯示模式,表示モード,표시 모드,Chế độ hiển thị,โหมดการแสดงผล
ui_settings_display_mode_description,选择全屏、无边框全屏或窗口模式;仅 PC 生效。,"Selects Fullscreen, Borderless Fullscreen, or Windowed mode. PC only.",選擇全螢幕、無邊框全螢幕或視窗模式;僅 PC 生效。,フルスクリーン、ボーダーレスフルスクリーン、ウィンドウ表示を選択します。PCのみ。,"전체 화면, 테두리 없는 전체 화면 또는 창 모드를 선택합니다. PC 전용입니다.","Chọn chế độ toàn màn hình, toàn màn hình không viền hoặc cửa sổ. Chỉ trên PC.",เลือกเต็มจอ เต็มจอไร้ขอบ หรือโหมดหน้าต่าง ใช้ได้บน PC เท่านั้น
ui_settings_display_resolution_title,显示分辨率,Display Resolution,顯示解析度,表示解像度,디스플레이 해상도,Độ phân giải hiển thị,ความละเอียดการแสดงผล
ui_settings_display_resolution_description,选择显示分辨率;仅 PC 生效。,Selects the display resolution. PC only.,選擇顯示解析度;僅 PC 生效。,表示解像度を選択します。PCのみ。,디스플레이 해상도를 선택합니다. PC 전용입니다。,Chọn độ phân giải hiển thị. Chỉ trên PC.,เลือกความละเอียดการแสดงผล ใช้ได้บน PC เท่านั้น
ui_settings_quality_performance,性能,Performance,效能,パフォーマンス,성능,Hiệu năng,ประสิทธิภาพ
ui_settings_quality_balanced,均衡,Balanced,均衡,バランス,균형,Cân bằng,สมดุล
ui_settings_quality_high_fidelity,高保真,High Fidelity,高保真,高品質,고품질,Chất lượng cao,คุณภาพสูง
ui_settings_bloom_off,关闭,Off,關閉,オフ,,Tắt,ปิด
ui_settings_bloom_performance,性能,Performance,效能,パフォーマンス,성능,Hiệu năng,ประสิทธิภาพ
ui_settings_bloom_standard,标准,Standard,標準,標準,표준,Tiêu chuẩn,มาตรฐาน
ui_settings_vfx_low,,Low,,,낮음,Thấp,ต่ำ
ui_settings_vfx_medium,,Medium,,,중간,Trung bình,กลาง
ui_settings_vfx_high,,High,,,높음,Cao,สูง
ui_settings_display_fullscreen,全屏,Fullscreen,全螢幕,フルスクリーン,전체 화면,Toàn màn hình,เต็มจอ
ui_settings_display_borderless_fullscreen,无边框全屏,Borderless Fullscreen,無邊框全螢幕,ボーダーレスフルスクリーン,테두리 없는 전체 화면,Toàn màn hình không viền,เต็มจอไร้ขอบ
ui_settings_display_windowed,窗口,Windowed,視窗,ウィンドウ,창 모드,Cửa sổ,หน้าต่าง
ui_settings_language_title,语言,Language,語言,言語,언어,Ngôn ngữ,ภาษา
ui_settings_language_description,切换界面和剧情对话所使用的语言。,Changes the language used by the interface and dialogue.,切換介面和劇情對話所使用的語言。,UIとストーリー会話に使用する言語を変更します。,인터페이스와 스토리 대화에 사용할 언어를 변경합니다。,Thay đổi ngôn ngữ dùng cho giao diện và hội thoại cốt truyện.,เปลี่ยนภาษาที่ใช้ในอินเทอร์เฟซและบทสนทนาเนื้อเรื่อง
ui_settings_offset_editor_title,时序校准,Timing Calibration,時序校準,タイミング調整,타이밍 보정,Hiệu chỉnh thời gian,การปรับจังหวะ
ui_settings_offset_editor_description,校准判定时序偏移,以获得更准确的音符判定。,Calibrates timing offset for more accurate note judgement.,校準判定時序偏移,以獲得更準確的音符判定。,より正確なノーツ判定のためにタイミングオフセットを調整します。,더 정확한 노트 판정을 위해 타이밍 오프셋을 보정합니다。,Hiệu chỉnh độ lệch thời gian để phán định Note chính xác hơn.,ปรับค่าความคลาดเคลื่อนของจังหวะเพื่อการตัดสินโน้ตที่แม่นยำขึ้น
ui_settings_enter,进入,Enter,進入,入る,입장,Vào,เข้าสู่
ui_settings_offset_instruction,调整偏移值,使红点与白点重合的瞬间(镲声)对准鼓声。,Adjust the offset until the red and white dots overlap; the cymbal sound should line up with the drum sound.,調整偏移值,使紅點與白點重合的瞬間(鈸聲)對準鼓聲。,赤い点と白い点が重なる瞬間(シンバル音)をドラム音に合わせるよう、オフセットを調整してください。,빨간 점과 흰 점이 겹치는 순간(심벌 소리)이 드럼 소리와 맞도록 오프셋을 조절하세요。,Điều chỉnh Offset để khi chấm đỏ và trắng chồng lên nhau thì tiếng cymbal khớp với tiếng trống.,ปรับ Offset ให้ขณะที่จุดสีแดงและสีขาวทับกัน เสียงฉาบตรงกับเสียงกลอง
ui_settings_offset_large_hint,偏移量过大,建议关闭判定音效。,The timing offset is large. Consider disabling note sound effects.,偏移量過大,建議關閉判定音效。,タイミングオフセットが大きすぎます。ノーツ判定音をオフにすることをおすすめします。,타이밍 오프셋이 너무 큽니다. 노트 판정음을 끄는 것을 권장합니다.,Độ lệch thời gian quá lớn. Hãy cân nhắc tắt âm thanh phán định Note.,ค่าความคลาดเคลื่อนของจังหวะสูงเกินไป แนะนำให้ปิดเสียงตัดสินโน้ต
ui_settings_keybinding_description,配置 Tap 和 Swipe 的键位。,Configure key bindings for Tap and Swipe.,設定 Tap 和 Swipe 的按鍵。,Tap と Swipe のキー設定を変更します。,Tap과 Swipe의 키 바인딩을 설정합니다。,Cấu hình phím cho Tap và Swipe.,กำหนดปุ่มสำหรับ Tap และ Swipe
ui_settings_keybinding_tap_title,Tap点击,Tap,Tap點擊,タップ,,Tap (Chạm),Tap (แตะ)
ui_settings_keybinding_tap_description,"用于触发 Tap、Stay 和 Hold 三种音符。","Triggers Tap, Stay, and Hold Notes.","用於觸發 Tap、Stay 和 Hold 三種音符。",Tap、Stay、Hold の3種類のーツを入力します。,"Tap, Stay, Hold의 세 종류 노트를 입력합니다。","Kích hoạt ba loại Note: Tap, Stay và Hold.","ใช้กดโน้ตสามประเภท ได้แก่ Tap, Stay และ Hold"
ui_settings_keybinding_swipe_title,Swipe划动,Swipe,Swipe滑動,スワイプ,스와이프,Swipe (Vuốt),Swipe (ปัด)
ui_settings_keybinding_swipe_description,用于触发任意方向的 Flick 音符。,Triggers Flick Notes in any direction.,用於觸發任意方向的 Flick 音符。,任意方向のFlickーツを入力します。,어느 방향으로든 Flick 노트를 입력합니다。,Kích hoạt Note Flick theo mọi hướng.,ใช้กดโน้ต Flick ได้ทุกทิศทาง
ui_settings_keybinding_listening_for_input,正在监听输入……,Listening for input...,正在監聽輸入……,入力を待っています...,입력을 기다리는 중...,Đang chờ thao tác nhập...,กำลังรอการป้อนข้อมูล...
ui_settings_keybinding_reset_title,重置键位,Reset Bindings,重設按鍵,キー設定をリセット,키 바인딩 초기화,Đặt lại phím,รีเซ็ตการกำหนดปุ่ม
ui_settings_keybinding_reset_description,将所有键位恢复为默认值。,Restores all keyboard bindings to their default values.,將所有按鍵恢復為預設值。,すべてのキー設定を初期値に戻します。,모든 키 바인딩을 기본값으로 복원합니다。,Khôi phục mọi gán phím về mặc định.,คืนค่าการกำหนดปุ่มทั้งหมดเป็นค่าเริ่มต้น
ui_settings_debug_mode_title,调试模式,Debug Mode,偵錯模式,デバッグモード,디버그 모드,Chế độ gỡ lỗi,โหมดดีบัก
ui_settings_debug_mode_description,启用开发调试功能。,Enables developer debugging features.,啟用開發偵錯功能。,開発用のデバッグ機能を有効にします。,개발용 디버그 기능을 켭니다。,Bật các tính năng gỡ lỗi dành cho nhà phát triển.,เปิดใช้ฟังก์ชันดีบักสำหรับนักพัฒนา
ui_settings_judgement_override_title,判定覆盖,Judgement Override,判定覆寫,判定上書き,판정 덮어쓰기,Ghi đè phán định,แทนที่การตัดสิน
ui_settings_judgement_override_description,为测试覆盖正常的判定处理。,Overrides normal judgement processing for testing.,為測試覆寫正常的判定處理。,テスト用に通常の判定処理を上書きします。,테스트를 위해 일반 판정 처리를 덮어씁니다。,Ghi đè xử lý phán định thông thường để thử nghiệm.,แทนที่การประมวลผลการตัดสินปกติเพื่อการทดสอบ
ui_settings_auto_play_title,自动游玩,Auto Play,自動遊玩,オートプレイ,자동 플레이,Tự động chơi,เล่นอัตโนมัติ
ui_settings_auto_play_description,自动演奏音符,仅用于测试。,Automatically plays Notes for testing only.,自動演奏音符,僅用於測試。,テスト用にノーツを自動演奏します。,테스트용으로 노트를 자동 연주합니다。,"Tự động chơi Note, chỉ dùng để thử nghiệm.",เล่นโน้ตอัตโนมัติสำหรับการทดสอบเท่านั้น
ui_summary_soullies_name,受丽丝,Soullies,受麗絲,ソリス,소리스,Soullies,โซลิส
ui_summary_soullies_sentence_0,这是一条测试文本。,This is a test text.,這是一條測試文本。,これはテストテキストです。,이것은 테스트 텍스트입니다.,Đây là một văn bản thử nghiệm.,นี่เป็นข้อความทดสอบ
ui_start_touch_to_start,- 触摸以开始游戏 -,- Touch to Start -,- 觸摸以開始遊戲 -,- タッチしてゲームを開始 -,- 터치하여 게임 시작 -,- Chạm để bắt đầu -,- แตะเพื่อเริ่มเกม -
"ui_start_test_version_notice","测试版本,游戏中的所有内容都有可能不是最终呈现。","Test version, all content in the game may not be final.","測試版本,遊戲中的所有內容都有可能不是最終呈現。",テストバージョンです。ゲーム内のすべてのコンテンツが最終版ではない可能性があります。,테스트 버전이므로 게임의 모든 내용이 최종본이 아닐 수 있습니다.,Đây là phiên bản thử nghiệm; nội dung trong trò chơi có thể chưa phải chính thức.,อยู่ในเวอร์ชันทดสอบ เนื้อหาทั้งหมดในเกมอาจยังไม่ใช่ขั้นสุดท้าย
ui_warning_photosensitive_epilepsy_title,光敏性癫痫警告,Photosensitive Epilepsy Warning,光敏性癲癇警告,光過敏性てんかんの警告,광과민성 간질 경고,Cảnh báo động kinh cảm quang,คำเตือนโรคลมชักไวต่อแสง
"ui_warning_photosensitive_epilepsy_content","极小部分人可能会在看到特定视觉图像(包括可能出现在视频游戏中的闪烁效果或图案)时出现癫痫症状。甚至没有癫痫史的人也可能具有一些可能会在玩视频游戏时导致“光敏性癫痫发作”的未确诊症状。如果你出现任何症状,请立即停止玩游戏并咨询医生。","A very small percentage of people may experience epileptic seizures when exposed to certain visual images, including flashing effects or patterns that may appear in video games. Even people with no history of epilepsy may have undiagnosed conditions that could cause a photosensitive epileptic seizure while playing video games. If you experience any of these symptoms, stop playing the game immediately and consult a doctor.","極小部分人可能會在看到特定視覺圖像(包括可能出現在電玩遊戲中的閃爍效果或圖案)時出現癲癇症狀。甚至沒有癲癇史的人也可能具有一些可能會在玩電玩遊戲時導致「光敏性癲癇發作」的未確診症狀。如果你出現任何症狀,請立即停止玩遊戲並諮詢醫生。","ごく少数ですが、ビデオゲームに登場する点滅効果やパターンなど、特定の視覚画像にさらされると、てんかん発作を起こすことがあります。てんかんの既往歴がない方でも、ゲームのプレイ中に光過敏性てんかん発作を引き起こす可能性のある未診断の疾患を抱えている場合があります。これらの症状が現れた場合は、直ちにゲームのプレイを中止し、医師に相談してください。","극소수의 사람은 비디오 게임에 나타날 수 있는 깜박이는 효과나 패턴을 포함한 특정 시각 이미지에 노출될 때 간질 발작을 경험할 수 있습니다. 간질 병력이 없는 사람도 게임을 하는 동안 광과민성 간질 발작을 유발할 수 있는 진단되지 않은 질환이 있을 수 있습니다. 이러한 증상이 나타나면 즉시 게임을 중단하고 의사와 상담하십시오.","Một tỷ lệ rất nhỏ người chơi có thể bị co giật khi tiếp xúc với một số hình ảnh trực quan, bao gồm hiệu ứng nhấp nháy hoặc hoa văn có thể xuất hiện trong trò chơi điện tử. Ngay cả người không có tiền sử động kinh cũng có thể mắc tình trạng chưa được chẩn đoán, gây cơn động kinh cảm quang khi chơi. Nếu gặp bất kỳ triệu chứng nào, hãy dừng chơi ngay và tham khảo ý kiến bác sĩ.","ผู้เล่นส่วนน้อยมากอาจเกิดอาการชักเมื่อสัมผัสภาพบางประเภท รวมถึงเอฟเฟกต์กะพริบหรือรูปแบบที่อาจปรากฏในวิดีโอเกม แม้ผู้ที่ไม่มีประวัติโรคลมชักก็อาจมีภาวะที่ยังไม่ได้รับการวินิจฉัยซึ่งทำให้เกิดอาการชักจากแสงขณะเล่นวิดีโอเกมได้ หากมีอาการดังกล่าว โปรดหยุดเล่นทันทีและปรึกษาแพทย์"
ui_common_chapter,章节,Chapter,章節,チャプター,챕터,Chương,บท
ui_chapter_story_mode,剧情模式,Story Mode,劇情模式,ストーリーモード,스토리 모드,Chế độ Cốt truyện,โหมดเนื้อเรื่อง
ui_chapter_song_mode,歌曲模式,Song Mode,歌曲模式,楽曲モード,곡 모드,Chế độ Bài hát,โหมดเพลง
ui_chapter_beatmaps_completed,完成谱面,Beatmaps Completed,完成譜面,クリア譜面数,완료한 채보,Số bản nhạc đã hoàn thành,จำนวนแผนผังโน้ตที่เล่นจบ
ui_score_full_combo,全连,Full Combo,全連,フルコンボ,풀 콤보,Full Combo,ฟูลคอมโบ
ui_score_all_perfect,全完美判定,All Perfect,全完美判定,オールパーフェクト,올 퍼펙트,All Perfect,ออลเพอร์เฟกต์
ui_song_chart_label,谱面,Chart,譜面,譜面,채보,Bản nhạc,แผนผังโน้ต
ui_song_chart_designer_label,谱师,Chart Designer,譜面設計,譜面制作者,채보 제작자,Người thiết kế bản nhạc,ผู้ออกแบบแผนผังโน้ต
ui_song_illustration_label,插画,Illustration,插畫,イラスト,일러스트,Minh họa,ภาพประกอบ
ui_song_composer_label,作曲,Composer,作曲,作曲,작곡,Nhà soạn nhạc,ผู้ประพันธ์เพลง
ui_song_length_label,曲目时长,Song Length,曲目時長,楽曲時間,곡 길이,Thời lượng bài hát,ความยาวเพลง
ui_song_unknown_charter,未知谱师,Unknown Charter,未知譜面設計,不明な譜面制作者,알 수 없는 채보 제작자,Người thiết kế bản nhạc không rõ,ผู้ออกแบบแผนผังโน้ตไม่ทราบชื่อ
ui_gameplay_loading,加载中...,Loading...,載入中...,読み込み中...,불러오는 중...,Đang tải...,กำลังโหลด...
ui_gameplay_pause_title,暂停,Pause,暫停,一時停止,일시 정지,Tạm dừng,หยุดชั่วคราว
ui_common_exit,退出,Exit,退出,終了,종료,Thoát,ออก
ui_common_retry,重试,Retry,重試,再挑戦,재시도,Thử lại,ลองใหม่
ui_common_return,返回,Return,返回,戻る,돌아가기,Quay lại,กลับ
ui_common_restart,重新开始,Restart,重新開始,最初からやり直す,다시 시작,Chơi lại,เริ่มใหม่
ui_common_continue,继续,Continue,繼續,続ける,계속,Tiếp tục,ดำเนินการต่อ
ui_gameplay_ready,准备,Ready,準備,準備完了,준비,Chuẩn bị,พร้อม
ui_gameplay_performance_complete,演奏完成,Performance Complete,演奏完成,演奏完了,연주 완료,Hoàn thành màn chơi,เล่นจบแล้ว
ui_result_graph_title,判定分布,Result Graph,判定分布,判定グラフ,판정 그래프,Biểu đồ phán định,กราฟการตัดสิน
ui_result_beatmap_info,谱面信息,Beatmap Info,譜面資訊,譜面情報,채보 정보,Thông tin bản nhạc,ข้อมูลแผนผังโน้ต
ui_result_accuracy_label,准确率,Accuracy,準確率,精度,정확도,Độ chính xác,ความแม่นยำ
ui_result_difficulty_label,难度,Difficulty,難度,難易度,난이도,Độ khó,ความยาก
ui_result_bpm_label,BPM,BPM,BPM,BPM,BPM,BPM,BPM
ui_result_max_combo_label,最大连击,Max Combo,最大連擊,最大コンボ,최대 콤보,Combo cao nhất,คอมโบสูงสุด
ui_judgement_perfect,完美,Perfect,完美,パーフェクト,퍼펙트,Hoàn hảo,สมบูรณ์แบบ
ui_judgement_good,良好,Good,良好,グッド,굿,Tốt,ดี
ui_judgement_bad,失误,Bad,失誤,バッド,배드,Kém,พลาด
ui_judgement_miss,漏击,Miss,漏擊,ミス,미스,Trượt,พลาด
ui_common_not_available,暂无数据,N/A,暫無資料,データなし,데이터 없음,Không có dữ liệu,ไม่มีข้อมูล
1 Key Chinese (Simplified)(zh-CN) English(en) Chinese (Traditional)(zh-TW) Japanese(ja) Korean(ko) Vietnamese (Vietnam)(vi-VN) Thai(th)
11 ui_gameplay_pause_resume 继续游戏 Resume 繼續遊戲 ゲームを再開 게임 계속하기 Tiếp tục เล่นต่อ
12 ui_gameplay_pause_settings 游戏设置 Settings 遊戲設定 設定 설정 Cài đặt การตั้งค่า
13 ui_gameplay_pause_return_to_menu 返回标题 Return to Title 返回標題 タイトルへ戻る 타이틀로 돌아가기 Về màn hình tiêu đề กลับสู่หน้าชื่อเรื่อง
14 ui_common_back 返回 Back 返回 戻る 뒤로 Quay lại กลับ
15 ui_common_on On オン 켜기 Bật เปิด
16 ui_common_off Off オフ 끄기 Tắt ปิด
17 ui_settings_title 设置 Settings 設定 設定 설정 Cài đặt การตั้งค่า
18 ui_settings_category_audio 音频 Audio 音效 オーディオ 오디오 Âm thanh เสียง
19 ui_settings_category_graphics 画面 Graphics 圖像 グラフィック 그래픽 Đồ họa กราฟิก
20 ui_settings_category_gameplay 游戏 Gameplay 遊玩 ゲームプレイ 게임플레이 Lối chơi เกมเพลย์
21 ui_settings_category_key_bindings 键位绑定 Key Bindings 按鍵綁定 キー設定 키 바인딩 Gán phím การกำหนดปุ่ม
22 ui_settings_category_debug 调试 Debug 偵錯 デバッグ 디버그 Gỡ lỗi ดีบัก
23 ui_settings_master_volume_title 主音量 Master Volume 主音量 マスター音量 마스터 볼륨 Âm lượng tổng ระดับเสียงหลัก
24 ui_settings_master_volume_description 调整游戏中所有声音的总音量。 Adjusts the volume of all game audio. 調整遊戲中所有聲音的總音量。 ゲーム内のすべての音声の音量を調整します。 게임 내 모든 사운드의 전체 볼륨을 조절합니다。 Điều chỉnh âm lượng của toàn bộ âm thanh trong game. ปรับระดับเสียงรวมของเสียงทั้งหมดในเกม
25 ui_settings_music_volume_title 音乐音量 Music Volume 音樂音量 音楽音量 음악 볼륨 Âm lượng nhạc ระดับเสียงเพลง
26 ui_settings_music_volume_description 调整音乐的音量。 Adjusts music volume. 調整音樂的音量。 音楽の音量を調整します。 음악 볼륨을 조절합니다。 Điều chỉnh âm lượng nhạc. ปรับระดับเสียงเพลง
27 ui_settings_sfx_volume_title 音效音量 Sound Effects Volume 音效音量 効果音音量 효과음 볼륨 Âm lượng hiệu ứng âm thanh ระดับเสียงเอฟเฟกต์
28 ui_settings_sfx_volume_description 调整游戏音效的音量。 Adjusts sound effect volume. 調整遊戲音效的音量。 効果音の音量を調整します。 효과음 볼륨을 조절합니다。 Điều chỉnh âm lượng hiệu ứng âm thanh. ปรับระดับเสียงเอฟเฟกต์
29 ui_settings_ui_volume_title UI 音量 UI Volume UI 音量 UI音量 UI 볼륨 Âm lượng UI ระดับเสียง UI
30 ui_settings_ui_volume_description 调整界面操作音效的音量。 Adjusts interface sound volume. 調整介面操作音效的音量。 UI操作音の音量を調整します。 인터페이스 효과음 볼륨을 조절합니다。 Điều chỉnh âm lượng âm thanh giao diện. ปรับระดับเสียงของอินเทอร์เฟซ
31 ui_settings_ingame_audio_effects_title 游戏内声音特效 In-Game Audio Effects 遊戲內聲音特效 ゲーム内音響エフェクト 게임 내 오디오 효과 Hiệu ứng âm thanh trong màn chơi เอฟเฟกต์เสียงระหว่างเล่น
32 ui_settings_ingame_audio_effects_description 启用游戏中的高通、低通等声音滤波效果。 Enables gameplay audio effects such as high-pass and low-pass filters. 啟用遊戲中的高通、低通等聲音濾波效果。 ハイパス・ローパスなどのゲーム内音響フィルターを有効にします。 하이패스와 로우패스 등의 게임 내 오디오 필터 효과를 켭니다。 Bật các hiệu ứng âm thanh trong màn chơi như bộ lọc thông cao và thông thấp. เปิดใช้เอฟเฟกต์ตัวกรองเสียงระหว่างเล่น เช่น ไฮพาสและโลว์พาส
33 ui_settings_quality_preset_title 画质预设 Quality Preset 畫質預設 画質プリセット 그래픽 프리셋 Thiết lập chất lượng ค่าที่ตั้งไว้ของคุณภาพ
34 ui_settings_quality_preset_description 选择整体渲染质量预设。 Selects the overall rendering quality preset. 選擇整體渲染品質預設。 全体的なレンダリング品質のプリセットを選択します。 전체 렌더링 품질 프리셋을 선택합니다。 Chọn thiết lập sẵn cho chất lượng hiển thị tổng thể. เลือกค่าที่ตั้งไว้ของคุณภาพการเรนเดอร์โดยรวม
35 ui_settings_render_scale_title 渲染比例 Render Scale 渲染比例 レンダリングスケール 렌더 스케일 Tỷ lệ dựng hình สเกลการเรนเดอร์
36 ui_settings_render_scale_description 调整内部渲染分辨率;降低该值可提升性能。 Adjusts internal render resolution. Lower values improve performance. 調整內部渲染解析度;降低此值可提升效能。 内部レンダリング解像度を調整します。低くすると性能が向上します。 내부 렌더링 해상도를 조절합니다. 낮출수록 성능이 향상됩니다。 Điều chỉnh độ phân giải dựng hình nội bộ. Giá trị thấp hơn giúp cải thiện hiệu năng. ปรับความละเอียดการเรนเดอร์ภายใน ค่าที่ต่ำลงช่วยเพิ่มประสิทธิภาพ
37 ui_settings_frame_limit_title 帧率上限 Frame Limit 幀率上限 フレームレート上限 프레임 제한 Giới hạn khung hình ขีดจำกัดเฟรมเรต
38 ui_settings_frame_limit_description 设置最高帧率;降低该值可减轻设备负载。 Sets the maximum frame rate. Lower values reduce device load. 設定最高幀率;降低此值可減輕裝置負載。 最大フレームレートを設定します。低くすると端末負荷を下げられます。 최대 프레임률을 설정합니다. 낮출수록 기기 부하가 줄어듭니다。 Đặt tốc độ khung hình tối đa. Giá trị thấp hơn giảm tải cho thiết bị. ตั้งค่าเฟรมเรตสูงสุด ค่าที่ต่ำลงช่วยลดภาระของอุปกรณ์
39 ui_settings_post_processing_title 后处理 Post Processing 後處理 ポストプロセス 후처리 Hậu xử lý โพสต์โปรเซส
40 ui_settings_post_processing_description 启用所有相机后处理效果。 Enables all camera post-processing effects. 啟用所有相機後處理效果。 すべてのカメラポストプロセス効果を有効にします。 모든 카메라 후처리 효과를 켭니다。 Bật toàn bộ hiệu ứng hậu xử lý của camera. เปิดใช้เอฟเฟกต์โพสต์โปรเซสของกล้องทั้งหมด
41 ui_settings_bloom_quality_title Bloom 质量 Bloom Quality Bloom 品質 ブルーム品質 블룸 품질 Chất lượng Bloom คุณภาพบลูม
42 ui_settings_bloom_quality_description 设置 Bloom 质量;仅在启用后处理时生效。 Sets Bloom quality. Only takes effect while post-processing is enabled. 設定 Bloom 品質;僅在啟用後處理時生效。 ブルーム品質を設定します。ポストプロセス有効時のみ反映されます。 블룸 품질을 설정합니다. 후처리가 켜져 있을 때만 적용됩니다。 Đặt chất lượng Bloom. Chỉ có hiệu lực khi hậu xử lý được bật. ตั้งค่าคุณภาพ Bloom มีผลเมื่อเปิดโพสต์โปรเซสเท่านั้น
43 ui_settings_vfx_quality_title VFX 质量 VFX Quality VFX 品質 VFX品質 VFX 품질 Chất lượng VFX คุณภาพ VFX
44 ui_settings_vfx_quality_description 设置音符和演出特效的质量等级。 Sets quality levels for Notes and performance effects. 設定音符和演出特效的品質等級。 ノーツと演出エフェクトの品質を設定します。 노트와 연출 효과의 품질 단계를 설정합니다。 Đặt mức chất lượng cho Note và hiệu ứng trình diễn. ตั้งระดับคุณภาพของโน้ตและเอฟเฟกต์การแสดง
45 ui_settings_vsync_title 垂直同步 VSync 垂直同步 垂直同期 수직 동기화 Đồng bộ dọc ซิงก์แนวตั้ง
46 ui_settings_vsync_description 使帧输出与显示器刷新率同步;仅 PC 生效。 Synchronizes frame output with the display refresh rate. PC only. 使幀輸出與螢幕更新率同步;僅 PC 生效。 フレーム出力をディスプレイのリフレッシュレートに同期します。PCのみ。 프레임 출력을 디스플레이 주사율과 동기화합니다. PC 전용입니다。 Đồng bộ khung hình với tần số quét màn hình. Chỉ trên PC. ซิงก์การแสดงผลเฟรมกับอัตรารีเฟรชของจอ ใช้ได้บน PC เท่านั้น
47 ui_settings_display_mode_title 显示模式 Display Mode 顯示模式 表示モード 표시 모드 Chế độ hiển thị โหมดการแสดงผล
48 ui_settings_display_mode_description 选择全屏、无边框全屏或窗口模式;仅 PC 生效。 Selects Fullscreen, Borderless Fullscreen, or Windowed mode. PC only. 選擇全螢幕、無邊框全螢幕或視窗模式;僅 PC 生效。 フルスクリーン、ボーダーレスフルスクリーン、ウィンドウ表示を選択します。PCのみ。 전체 화면, 테두리 없는 전체 화면 또는 창 모드를 선택합니다. PC 전용입니다. Chọn chế độ toàn màn hình, toàn màn hình không viền hoặc cửa sổ. Chỉ trên PC. เลือกเต็มจอ เต็มจอไร้ขอบ หรือโหมดหน้าต่าง ใช้ได้บน PC เท่านั้น
49 ui_settings_display_resolution_title 显示分辨率 Display Resolution 顯示解析度 表示解像度 디스플레이 해상도 Độ phân giải hiển thị ความละเอียดการแสดงผล
50 ui_settings_display_resolution_description 选择显示分辨率;仅 PC 生效。 Selects the display resolution. PC only. 選擇顯示解析度;僅 PC 生效。 表示解像度を選択します。PCのみ。 디스플레이 해상도를 선택합니다. PC 전용입니다。 Chọn độ phân giải hiển thị. Chỉ trên PC. เลือกความละเอียดการแสดงผล ใช้ได้บน PC เท่านั้น
51 ui_settings_quality_performance 性能 Performance 效能 パフォーマンス 성능 Hiệu năng ประสิทธิภาพ
52 ui_settings_quality_balanced 均衡 Balanced 均衡 バランス 균형 Cân bằng สมดุล
53 ui_settings_quality_high_fidelity 高保真 High Fidelity 高保真 高品質 고품질 Chất lượng cao คุณภาพสูง
54 ui_settings_bloom_off 关闭 Off 關閉 オフ Tắt ปิด
55 ui_settings_bloom_performance 性能 Performance 效能 パフォーマンス 성능 Hiệu năng ประสิทธิภาพ
56 ui_settings_bloom_standard 标准 Standard 標準 標準 표준 Tiêu chuẩn มาตรฐาน
57 ui_settings_vfx_low Low 낮음 Thấp ต่ำ
58 ui_settings_vfx_medium Medium 중간 Trung bình กลาง
59 ui_settings_vfx_high High 높음 Cao สูง
60 ui_settings_display_fullscreen 全屏 Fullscreen 全螢幕 フルスクリーン 전체 화면 Toàn màn hình เต็มจอ
61 ui_settings_display_borderless_fullscreen 无边框全屏 Borderless Fullscreen 無邊框全螢幕 ボーダーレスフルスクリーン 테두리 없는 전체 화면 Toàn màn hình không viền เต็มจอไร้ขอบ
62 ui_settings_display_windowed 窗口 Windowed 視窗 ウィンドウ 창 모드 Cửa sổ หน้าต่าง
63 ui_settings_language_title 语言 Language 語言 言語 언어 Ngôn ngữ ภาษา
64 ui_settings_language_description 切换界面和剧情对话所使用的语言。 Changes the language used by the interface and dialogue. 切換介面和劇情對話所使用的語言。 UIとストーリー会話に使用する言語を変更します。 인터페이스와 스토리 대화에 사용할 언어를 변경합니다。 Thay đổi ngôn ngữ dùng cho giao diện và hội thoại cốt truyện. เปลี่ยนภาษาที่ใช้ในอินเทอร์เฟซและบทสนทนาเนื้อเรื่อง
65 ui_settings_offset_editor_title 时序校准 Timing Calibration 時序校準 タイミング調整 타이밍 보정 Hiệu chỉnh thời gian การปรับจังหวะ
66 ui_settings_offset_editor_description 校准判定时序偏移,以获得更准确的音符判定。 Calibrates timing offset for more accurate note judgement. 校準判定時序偏移,以獲得更準確的音符判定。 より正確なノーツ判定のためにタイミングオフセットを調整します。 더 정확한 노트 판정을 위해 타이밍 오프셋을 보정합니다。 Hiệu chỉnh độ lệch thời gian để phán định Note chính xác hơn. ปรับค่าความคลาดเคลื่อนของจังหวะเพื่อการตัดสินโน้ตที่แม่นยำขึ้น
67 ui_settings_enter 进入 Enter 進入 入る 입장 Vào เข้าสู่
68 ui_settings_offset_instruction 调整偏移值,使红点与白点重合的瞬间(镲声)对准鼓声。 Adjust the offset until the red and white dots overlap; the cymbal sound should line up with the drum sound. 調整偏移值,使紅點與白點重合的瞬間(鈸聲)對準鼓聲。 赤い点と白い点が重なる瞬間(シンバル音)をドラム音に合わせるよう、オフセットを調整してください。 빨간 점과 흰 점이 겹치는 순간(심벌 소리)이 드럼 소리와 맞도록 오프셋을 조절하세요。 Điều chỉnh Offset để khi chấm đỏ và trắng chồng lên nhau thì tiếng cymbal khớp với tiếng trống. ปรับ Offset ให้ขณะที่จุดสีแดงและสีขาวทับกัน เสียงฉาบตรงกับเสียงกลอง
69 ui_settings_offset_large_hint 偏移量过大,建议关闭判定音效。 The timing offset is large. Consider disabling note sound effects. 偏移量過大,建議關閉判定音效。 タイミングオフセットが大きすぎます。ノーツ判定音をオフにすることをおすすめします。 타이밍 오프셋이 너무 큽니다. 노트 판정음을 끄는 것을 권장합니다. Độ lệch thời gian quá lớn. Hãy cân nhắc tắt âm thanh phán định Note. ค่าความคลาดเคลื่อนของจังหวะสูงเกินไป แนะนำให้ปิดเสียงตัดสินโน้ต
70 ui_settings_keybinding_description 配置 Tap 和 Swipe 的键位。 Configure key bindings for Tap and Swipe. 設定 Tap 和 Swipe 的按鍵。 Tap と Swipe のキー設定を変更します。 Tap과 Swipe의 키 바인딩을 설정합니다。 Cấu hình phím cho Tap và Swipe. กำหนดปุ่มสำหรับ Tap และ Swipe
71 ui_settings_keybinding_tap_title Tap(点击) Tap Tap(點擊) タップ Tap (Chạm) Tap (แตะ)
72 ui_settings_keybinding_tap_description 用于触发 Tap、Stay 和 Hold 三种音符。 Triggers Tap, Stay, and Hold Notes. 用於觸發 Tap、Stay 和 Hold 三種音符。 Tap、Stay、Hold の3種類のノーツを入力します。 Tap, Stay, Hold의 세 종류 노트를 입력합니다。 Kích hoạt ba loại Note: Tap, Stay và Hold. ใช้กดโน้ตสามประเภท ได้แก่ Tap, Stay และ Hold
73 ui_settings_keybinding_swipe_title Swipe(划动) Swipe Swipe(滑動) スワイプ 스와이프 Swipe (Vuốt) Swipe (ปัด)
74 ui_settings_keybinding_swipe_description 用于触发任意方向的 Flick 音符。 Triggers Flick Notes in any direction. 用於觸發任意方向的 Flick 音符。 任意方向のFlickノーツを入力します。 어느 방향으로든 Flick 노트를 입력합니다。 Kích hoạt Note Flick theo mọi hướng. ใช้กดโน้ต Flick ได้ทุกทิศทาง
75 ui_settings_keybinding_listening_for_input 正在监听输入…… Listening for input... 正在監聽輸入…… 入力を待っています... 입력을 기다리는 중... Đang chờ thao tác nhập... กำลังรอการป้อนข้อมูล...
76 ui_settings_keybinding_reset_title 重置键位 Reset Bindings 重設按鍵 キー設定をリセット 키 바인딩 초기화 Đặt lại phím รีเซ็ตการกำหนดปุ่ม
77 ui_settings_keybinding_reset_description 将所有键位恢复为默认值。 Restores all keyboard bindings to their default values. 將所有按鍵恢復為預設值。 すべてのキー設定を初期値に戻します。 모든 키 바인딩을 기본값으로 복원합니다。 Khôi phục mọi gán phím về mặc định. คืนค่าการกำหนดปุ่มทั้งหมดเป็นค่าเริ่มต้น
78 ui_settings_debug_mode_title 调试模式 Debug Mode 偵錯模式 デバッグモード 디버그 모드 Chế độ gỡ lỗi โหมดดีบัก
79 ui_settings_debug_mode_description 启用开发调试功能。 Enables developer debugging features. 啟用開發偵錯功能。 開発用のデバッグ機能を有効にします。 개발용 디버그 기능을 켭니다。 Bật các tính năng gỡ lỗi dành cho nhà phát triển. เปิดใช้ฟังก์ชันดีบักสำหรับนักพัฒนา
80 ui_settings_judgement_override_title 判定覆盖 Judgement Override 判定覆寫 判定上書き 판정 덮어쓰기 Ghi đè phán định แทนที่การตัดสิน
81 ui_settings_judgement_override_description 为测试覆盖正常的判定处理。 Overrides normal judgement processing for testing. 為測試覆寫正常的判定處理。 テスト用に通常の判定処理を上書きします。 테스트를 위해 일반 판정 처리를 덮어씁니다。 Ghi đè xử lý phán định thông thường để thử nghiệm. แทนที่การประมวลผลการตัดสินปกติเพื่อการทดสอบ
82 ui_settings_auto_play_title 自动游玩 Auto Play 自動遊玩 オートプレイ 자동 플레이 Tự động chơi เล่นอัตโนมัติ
83 ui_settings_auto_play_description 自动演奏音符,仅用于测试。 Automatically plays Notes for testing only. 自動演奏音符,僅用於測試。 テスト用にノーツを自動演奏します。 테스트용으로 노트를 자동 연주합니다。 Tự động chơi Note, chỉ dùng để thử nghiệm. เล่นโน้ตอัตโนมัติสำหรับการทดสอบเท่านั้น
84 ui_summary_soullies_name 受丽丝 Soullies 受麗絲 ソリス 소리스 Soullies โซลิส
85 ui_summary_soullies_sentence_0 这是一条测试文本。 This is a test text. 這是一條測試文本。 これはテストテキストです。 이것은 테스트 텍스트입니다. Đây là một văn bản thử nghiệm. นี่เป็นข้อความทดสอบ
86 ui_start_touch_to_start - 触摸以开始游戏 - - Touch to Start - - 觸摸以開始遊戲 - - タッチしてゲームを開始 - - 터치하여 게임 시작 - - Chạm để bắt đầu - - แตะเพื่อเริ่มเกม -
87 ui_start_test_version_notice 测试版本,游戏中的所有内容都有可能不是最终呈现。 Test version, all content in the game may not be final. 測試版本,遊戲中的所有內容都有可能不是最終呈現。 テストバージョンです。ゲーム内のすべてのコンテンツが最終版ではない可能性があります。 테스트 버전이므로 게임의 모든 내용이 최종본이 아닐 수 있습니다. Đây là phiên bản thử nghiệm; nội dung trong trò chơi có thể chưa phải chính thức. อยู่ในเวอร์ชันทดสอบ เนื้อหาทั้งหมดในเกมอาจยังไม่ใช่ขั้นสุดท้าย
88 ui_warning_photosensitive_epilepsy_title 光敏性癫痫警告 Photosensitive Epilepsy Warning 光敏性癲癇警告 光過敏性てんかんの警告 광과민성 간질 경고 Cảnh báo động kinh cảm quang คำเตือนโรคลมชักไวต่อแสง
89 ui_warning_photosensitive_epilepsy_content 极小部分人可能会在看到特定视觉图像(包括可能出现在视频游戏中的闪烁效果或图案)时出现癫痫症状。甚至没有癫痫史的人也可能具有一些可能会在玩视频游戏时导致“光敏性癫痫发作”的未确诊症状。如果你出现任何症状,请立即停止玩游戏并咨询医生。 A very small percentage of people may experience epileptic seizures when exposed to certain visual images, including flashing effects or patterns that may appear in video games. Even people with no history of epilepsy may have undiagnosed conditions that could cause a photosensitive epileptic seizure while playing video games. If you experience any of these symptoms, stop playing the game immediately and consult a doctor. 極小部分人可能會在看到特定視覺圖像(包括可能出現在電玩遊戲中的閃爍效果或圖案)時出現癲癇症狀。甚至沒有癲癇史的人也可能具有一些可能會在玩電玩遊戲時導致「光敏性癲癇發作」的未確診症狀。如果你出現任何症狀,請立即停止玩遊戲並諮詢醫生。 ごく少数ですが、ビデオゲームに登場する点滅効果やパターンなど、特定の視覚画像にさらされると、てんかん発作を起こすことがあります。てんかんの既往歴がない方でも、ゲームのプレイ中に光過敏性てんかん発作を引き起こす可能性のある未診断の疾患を抱えている場合があります。これらの症状が現れた場合は、直ちにゲームのプレイを中止し、医師に相談してください。 극소수의 사람은 비디오 게임에 나타날 수 있는 깜박이는 효과나 패턴을 포함한 특정 시각 이미지에 노출될 때 간질 발작을 경험할 수 있습니다. 간질 병력이 없는 사람도 게임을 하는 동안 광과민성 간질 발작을 유발할 수 있는 진단되지 않은 질환이 있을 수 있습니다. 이러한 증상이 나타나면 즉시 게임을 중단하고 의사와 상담하십시오. Một tỷ lệ rất nhỏ người chơi có thể bị co giật khi tiếp xúc với một số hình ảnh trực quan, bao gồm hiệu ứng nhấp nháy hoặc hoa văn có thể xuất hiện trong trò chơi điện tử. Ngay cả người không có tiền sử động kinh cũng có thể mắc tình trạng chưa được chẩn đoán, gây cơn động kinh cảm quang khi chơi. Nếu gặp bất kỳ triệu chứng nào, hãy dừng chơi ngay và tham khảo ý kiến bác sĩ. ผู้เล่นส่วนน้อยมากอาจเกิดอาการชักเมื่อสัมผัสภาพบางประเภท รวมถึงเอฟเฟกต์กะพริบหรือรูปแบบที่อาจปรากฏในวิดีโอเกม แม้ผู้ที่ไม่มีประวัติโรคลมชักก็อาจมีภาวะที่ยังไม่ได้รับการวินิจฉัยซึ่งทำให้เกิดอาการชักจากแสงขณะเล่นวิดีโอเกมได้ หากมีอาการดังกล่าว โปรดหยุดเล่นทันทีและปรึกษาแพทย์
90 ui_common_chapter 章节 Chapter 章節 チャプター 챕터 Chương บท
91 ui_chapter_story_mode 剧情模式 Story Mode 劇情模式 ストーリーモード 스토리 모드 Chế độ Cốt truyện โหมดเนื้อเรื่อง
92 ui_chapter_song_mode 歌曲模式 Song Mode 歌曲模式 楽曲モード 곡 모드 Chế độ Bài hát โหมดเพลง
93 ui_chapter_beatmaps_completed 完成谱面 Beatmaps Completed 完成譜面 クリア譜面数 완료한 채보 Số bản nhạc đã hoàn thành จำนวนแผนผังโน้ตที่เล่นจบ
94 ui_score_full_combo 全连 Full Combo 全連 フルコンボ 풀 콤보 Full Combo ฟูลคอมโบ
95 ui_score_all_perfect 全完美判定 All Perfect 全完美判定 オールパーフェクト 올 퍼펙트 All Perfect ออลเพอร์เฟกต์
96 ui_song_chart_label 谱面 Chart 譜面 譜面 채보 Bản nhạc แผนผังโน้ต
97 ui_song_chart_designer_label 谱师 Chart Designer 譜面設計 譜面制作者 채보 제작자 Người thiết kế bản nhạc ผู้ออกแบบแผนผังโน้ต
98 ui_song_illustration_label 插画 Illustration 插畫 イラスト 일러스트 Minh họa ภาพประกอบ
99 ui_song_composer_label 作曲 Composer 作曲 作曲 작곡 Nhà soạn nhạc ผู้ประพันธ์เพลง
100 ui_song_length_label 曲目时长 Song Length 曲目時長 楽曲時間 곡 길이 Thời lượng bài hát ความยาวเพลง
101 ui_song_unknown_charter 未知谱师 Unknown Charter 未知譜面設計 不明な譜面制作者 알 수 없는 채보 제작자 Người thiết kế bản nhạc không rõ ผู้ออกแบบแผนผังโน้ตไม่ทราบชื่อ
102 ui_gameplay_loading 加载中... Loading... 載入中... 読み込み中... 불러오는 중... Đang tải... กำลังโหลด...
103 ui_gameplay_pause_title 暂停 Pause 暫停 一時停止 일시 정지 Tạm dừng หยุดชั่วคราว
104 ui_common_exit 退出 Exit 退出 終了 종료 Thoát ออก
105 ui_common_retry 重试 Retry 重試 再挑戦 재시도 Thử lại ลองใหม่
106 ui_common_return 返回 Return 返回 戻る 돌아가기 Quay lại กลับ
107 ui_common_restart 重新开始 Restart 重新開始 最初からやり直す 다시 시작 Chơi lại เริ่มใหม่
108 ui_common_continue 继续 Continue 繼續 続ける 계속 Tiếp tục ดำเนินการต่อ
109 ui_gameplay_ready 准备 Ready 準備 準備完了 준비 Chuẩn bị พร้อม
110 ui_gameplay_performance_complete 演奏完成 Performance Complete 演奏完成 演奏完了 연주 완료 Hoàn thành màn chơi เล่นจบแล้ว
111 ui_result_graph_title 判定分布 Result Graph 判定分布 判定グラフ 판정 그래프 Biểu đồ phán định กราฟการตัดสิน
112 ui_result_beatmap_info 谱面信息 Beatmap Info 譜面資訊 譜面情報 채보 정보 Thông tin bản nhạc ข้อมูลแผนผังโน้ต
113 ui_result_accuracy_label 准确率 Accuracy 準確率 精度 정확도 Độ chính xác ความแม่นยำ
114 ui_result_difficulty_label 难度 Difficulty 難度 難易度 난이도 Độ khó ความยาก
115 ui_result_bpm_label BPM BPM BPM BPM BPM BPM BPM
116 ui_result_max_combo_label 最大连击 Max Combo 最大連擊 最大コンボ 최대 콤보 Combo cao nhất คอมโบสูงสุด
117 ui_judgement_perfect 完美 Perfect 完美 パーフェクト 퍼펙트 Hoàn hảo สมบูรณ์แบบ
118 ui_judgement_good 良好 Good 良好 グッド 굿 Tốt ดี
119 ui_judgement_bad 失误 Bad 失誤 バッド 배드 Kém พลาด
120 ui_judgement_miss 漏击 Miss 漏擊 ミス 미스 Trượt พลาด
121 ui_common_not_available 暂无数据 N/A 暫無資料 データなし 데이터 없음 Không có dữ liệu ไม่มีข้อมูล

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -775,7 +775,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -200, y: -5}
m_AnchoredPosition: {x: -150, y: -5}
m_SizeDelta: {x: 400, y: 60}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &3488836704216698879
@@ -1211,7 +1211,7 @@ GameObject:
- component: {fileID: 2372098947242245111}
- component: {fileID: 4898796744150641891}
m_Layer: 5
m_Name: Background (2)
m_Name: Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -1365,7 +1365,7 @@ GameObject:
- component: {fileID: 7352860199529444402}
- component: {fileID: 4769154830086934199}
- component: {fileID: 8415253725780224226}
- component: {fileID: 4825344777273958749}
- component: {fileID: 2867197996026523265}
m_Layer: 5
m_Name: Title
m_TagString: Untagged
@@ -1387,10 +1387,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 4019698789171748620}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 100, y: 60}
m_SizeDelta: {x: 600, y: 50}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 225, y: 0}
m_SizeDelta: {x: 500, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4769154830086934199
CanvasRenderer:
@@ -1448,8 +1448,8 @@ MonoBehaviour:
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 48
m_fontSizeBase: 48
m_fontSize: 36
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
@@ -1493,7 +1493,7 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &4825344777273958749
--- !u!114 &2867197996026523265
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -1502,36 +1502,22 @@ MonoBehaviour:
m_GameObject: {fileID: 7708928578317463321}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 344445a89b4f74a0e9a0a766903df87e, type: 3}
m_Script: {fileID: 11500000, guid: 209017a926f587a4394f52dc1e88a61e, type: 3}
m_Name:
m_EditorClassIdentifier:
mTerm:
mTermSecondary:
PrimaryTermModifier: 0
SecondaryTermModifier: 0
TermPrefix:
TermSuffix:
LocalizeOnAwake: 1
IgnoreRTL: 0
MaxCharactersInRTL: 0
IgnoreNumbersInRTL: 1
CorrectAlignmentForRTL: 1
AddSpacesToJoinedLanguages: 0
AllowLocalizedParameters: 1
AllowParameters: 1
TranslatedObjects: []
LocalizeEvent:
m_PersistentCalls:
m_Calls: []
AlwaysForceLocalize: 0
LocalizeCallBack:
Target: {fileID: 0}
MethodName:
mGUI_ShowReferences: 0
mGUI_ShowTems: 1
mGUI_ShowCallback: 0
mLocalizeTarget: {fileID: 0}
mLocalizeTargetName: I2.Loc.LocalizeTarget_TextMeshPro_UGUI
m_EditorClassIdentifier: Assembly-CSharp::Ichni.Localization.LocalizedTMPText
targetText: {fileID: 8415253725780224226}
stringReference:
m_TableReference:
m_TableCollectionName:
m_TableEntryReference:
m_KeyId: 0
m_Key:
m_FallbackState: 0
m_WaitForCompletion: 0
m_LocalVariables: []
references:
version: 2
RefIds: []
--- !u!1 &7759090154600781901
GameObject:
m_ObjectHideFlags: 0
@@ -1543,9 +1529,9 @@ GameObject:
- component: {fileID: 2825086724287110490}
- component: {fileID: 7025022105791610800}
- component: {fileID: 1154235964385939689}
- component: {fileID: 748981796795826234}
- component: {fileID: 4510512947691935035}
m_Layer: 5
m_Name: Title (1)
m_Name: Subtitle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -1565,10 +1551,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 4019698789171748620}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 100, y: 22.5}
m_SizeDelta: {x: 600, y: 25}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 225, y: -45}
m_SizeDelta: {x: 500, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7025022105791610800
CanvasRenderer:
@@ -1629,9 +1615,9 @@ MonoBehaviour:
m_fontSize: 24
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_enableAutoSizing: 1
m_fontSizeMin: 16
m_fontSizeMax: 24
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 512
@@ -1671,7 +1657,7 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &748981796795826234
--- !u!114 &4510512947691935035
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -1680,36 +1666,22 @@ MonoBehaviour:
m_GameObject: {fileID: 7759090154600781901}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 344445a89b4f74a0e9a0a766903df87e, type: 3}
m_Script: {fileID: 11500000, guid: 209017a926f587a4394f52dc1e88a61e, type: 3}
m_Name:
m_EditorClassIdentifier:
mTerm:
mTermSecondary:
PrimaryTermModifier: 0
SecondaryTermModifier: 0
TermPrefix:
TermSuffix:
LocalizeOnAwake: 1
IgnoreRTL: 0
MaxCharactersInRTL: 0
IgnoreNumbersInRTL: 1
CorrectAlignmentForRTL: 1
AddSpacesToJoinedLanguages: 0
AllowLocalizedParameters: 1
AllowParameters: 1
TranslatedObjects: []
LocalizeEvent:
m_PersistentCalls:
m_Calls: []
AlwaysForceLocalize: 0
LocalizeCallBack:
Target: {fileID: 0}
MethodName:
mGUI_ShowReferences: 0
mGUI_ShowTems: 1
mGUI_ShowCallback: 0
mLocalizeTarget: {fileID: 0}
mLocalizeTargetName: I2.Loc.LocalizeTarget_TextMeshPro_UGUI
m_EditorClassIdentifier: Assembly-CSharp::Ichni.Localization.LocalizedTMPText
targetText: {fileID: 1154235964385939689}
stringReference:
m_TableReference:
m_TableCollectionName:
m_TableEntryReference:
m_KeyId: 0
m_Key:
m_FallbackState: 0
m_WaitForCompletion: 0
m_LocalVariables: []
references:
version: 2
RefIds: []
--- !u!1 &9161412252175312324
GameObject:
m_ObjectHideFlags: 0
@@ -1746,7 +1718,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 500, y: -350}
m_SizeDelta: {x: 800, y: 200}
m_SizeDelta: {x: 700, y: 200}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &2088029594451152956
MonoBehaviour:
@@ -1760,8 +1732,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 63ac87ec6c134804c9cd877b8820d283, type: 3}
m_Name:
m_EditorClassIdentifier:
title:
subTitle:
titleBackground: {fileID: 4898796744150641891}
titleText: {fileID: 8415253725780224226}
subTitleText: {fileID: 1154235964385939689}

View File

@@ -132,7 +132,7 @@ GameObject:
- component: {fileID: 5060576571365556468}
- component: {fileID: 3592058414534029614}
- component: {fileID: 2474312952025664795}
- component: {fileID: 7073586363413078385}
- component: {fileID: 6919548982532019392}
m_Layer: 5
m_Name: Text (TMP)
m_TagString: Untagged
@@ -156,8 +156,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 200, y: -5}
m_SizeDelta: {x: 400, y: 50}
m_AnchoredPosition: {x: 125, y: -5}
m_SizeDelta: {x: 250, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3592058414534029614
CanvasRenderer:
@@ -187,10 +187,11 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\u5165\u529B\u3092\u5F85\u3063\u3066\u3044\u307E\u3059..."
m_text: "\u6B63\u5728\u76D1\u542C\u8F93\u5165\u2026\u2026"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 87c1b020037c81841b3d98dd497cbdeb, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: -5812992765432063453, guid: 87c1b020037c81841b3d98dd497cbdeb,
type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
@@ -214,31 +215,34 @@ MonoBehaviour:
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 36
m_fontSizeBase: 36
m_fontSize: 24
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_enableAutoSizing: 1
m_fontSizeMin: 16
m_fontSizeMax: 24
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -253,10 +257,10 @@ MonoBehaviour:
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 1
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &7073586363413078385
--- !u!114 &6919548982532019392
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -265,36 +269,22 @@ MonoBehaviour:
m_GameObject: {fileID: 5117509104407253998}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 344445a89b4f74a0e9a0a766903df87e, type: 3}
m_Script: {fileID: 11500000, guid: 209017a926f587a4394f52dc1e88a61e, type: 3}
m_Name:
m_EditorClassIdentifier:
mTerm: Menu UI/Settings_IsRebindingKey
mTermSecondary:
PrimaryTermModifier: 0
SecondaryTermModifier: 0
TermPrefix:
TermSuffix:
LocalizeOnAwake: 1
IgnoreRTL: 0
MaxCharactersInRTL: 0
IgnoreNumbersInRTL: 1
CorrectAlignmentForRTL: 1
AddSpacesToJoinedLanguages: 0
AllowLocalizedParameters: 1
AllowParameters: 1
TranslatedObjects: []
LocalizeEvent:
m_PersistentCalls:
m_Calls: []
AlwaysForceLocalize: 0
LocalizeCallBack:
Target: {fileID: 0}
MethodName:
mGUI_ShowReferences: 0
mGUI_ShowTems: 1
mGUI_ShowCallback: 0
mLocalizeTarget: {fileID: 0}
mLocalizeTargetName: I2.Loc.LocalizeTarget_TextMeshPro_UGUI
m_EditorClassIdentifier: Assembly-CSharp::Ichni.Localization.LocalizedTMPText
targetText: {fileID: 2474312952025664795}
stringReference:
m_TableReference:
m_TableCollectionName: GUID:971ba9d57d145154daf7371bd0e6b12f
m_TableEntryReference:
m_KeyId: 16866525339181061
m_Key:
m_FallbackState: 0
m_WaitForCompletion: 0
m_LocalVariables: []
references:
version: 2
RefIds: []
--- !u!1 &5975257480353016332
GameObject:
m_ObjectHideFlags: 0
@@ -306,6 +296,7 @@ GameObject:
- component: {fileID: 7629755617611759494}
- component: {fileID: 8007286970277077366}
- component: {fileID: 5643531126894557675}
- component: {fileID: 5954751767067649623}
m_Layer: 5
m_Name: Text (TMP)
m_TagString: Untagged
@@ -360,10 +351,11 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: Execute
m_text: ...
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontAsset: {fileID: 11400000, guid: 87c1b020037c81841b3d98dd497cbdeb, type: 2}
m_sharedMaterial: {fileID: -5812992765432063453, guid: 87c1b020037c81841b3d98dd497cbdeb,
type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
@@ -398,20 +390,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -429,6 +424,31 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &5954751767067649623
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5975257480353016332}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 209017a926f587a4394f52dc1e88a61e, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Ichni.Localization.LocalizedTMPText
targetText: {fileID: 5643531126894557675}
stringReference:
m_TableReference:
m_TableCollectionName:
m_TableEntryReference:
m_KeyId: 0
m_Key:
m_FallbackState: 0
m_WaitForCompletion: 0
m_LocalVariables: []
references:
version: 2
RefIds: []
--- !u!1 &6338319702404413715
GameObject:
m_ObjectHideFlags: 0
@@ -440,7 +460,7 @@ GameObject:
- component: {fileID: 4809331135606521131}
- component: {fileID: 4610618812000335788}
- component: {fileID: 1722593142608310948}
- component: {fileID: 8878948156582783634}
- component: {fileID: 830121712896079247}
m_Layer: 5
m_Name: Title
m_TagString: Untagged
@@ -462,10 +482,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 5668105170805566722}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 100, y: 60}
m_SizeDelta: {x: 600, y: 50}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 225, y: 0}
m_SizeDelta: {x: 500, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4610618812000335788
CanvasRenderer:
@@ -523,8 +543,8 @@ MonoBehaviour:
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 48
m_fontSizeBase: 48
m_fontSize: 36
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
@@ -534,20 +554,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -565,7 +588,7 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &8878948156582783634
--- !u!114 &830121712896079247
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -574,36 +597,22 @@ MonoBehaviour:
m_GameObject: {fileID: 6338319702404413715}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 344445a89b4f74a0e9a0a766903df87e, type: 3}
m_Script: {fileID: 11500000, guid: 209017a926f587a4394f52dc1e88a61e, type: 3}
m_Name:
m_EditorClassIdentifier:
mTerm:
mTermSecondary:
PrimaryTermModifier: 0
SecondaryTermModifier: 0
TermPrefix:
TermSuffix:
LocalizeOnAwake: 1
IgnoreRTL: 0
MaxCharactersInRTL: 0
IgnoreNumbersInRTL: 1
CorrectAlignmentForRTL: 1
AddSpacesToJoinedLanguages: 0
AllowLocalizedParameters: 1
AllowParameters: 1
TranslatedObjects: []
LocalizeEvent:
m_PersistentCalls:
m_Calls: []
AlwaysForceLocalize: 0
LocalizeCallBack:
Target: {fileID: 0}
MethodName:
mGUI_ShowReferences: 0
mGUI_ShowTems: 1
mGUI_ShowCallback: 0
mLocalizeTarget: {fileID: 0}
mLocalizeTargetName: I2.Loc.LocalizeTarget_TextMeshPro_UGUI
m_EditorClassIdentifier: Assembly-CSharp::Ichni.Localization.LocalizedTMPText
targetText: {fileID: 1722593142608310948}
stringReference:
m_TableReference:
m_TableCollectionName:
m_TableEntryReference:
m_KeyId: 0
m_Key:
m_FallbackState: 0
m_WaitForCompletion: 0
m_LocalVariables: []
references:
version: 2
RefIds: []
--- !u!1 &7817226485700523307
GameObject:
m_ObjectHideFlags: 0
@@ -615,9 +624,9 @@ GameObject:
- component: {fileID: 8725596012907959197}
- component: {fileID: 8967739015609294999}
- component: {fileID: 6504848274583113892}
- component: {fileID: 5062037213869781326}
- component: {fileID: 2961029731193376656}
m_Layer: 5
m_Name: Title (1)
m_Name: SubTitle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -637,10 +646,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 5668105170805566722}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 100, y: 22.5}
m_SizeDelta: {x: 600, y: 25}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 225, y: -45}
m_SizeDelta: {x: 500, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8967739015609294999
CanvasRenderer:
@@ -698,7 +707,7 @@ MonoBehaviour:
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 20.65
m_fontSize: 24
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 1
@@ -709,20 +718,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -740,7 +752,7 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &5062037213869781326
--- !u!114 &2961029731193376656
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -749,36 +761,22 @@ MonoBehaviour:
m_GameObject: {fileID: 7817226485700523307}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 344445a89b4f74a0e9a0a766903df87e, type: 3}
m_Script: {fileID: 11500000, guid: 209017a926f587a4394f52dc1e88a61e, type: 3}
m_Name:
m_EditorClassIdentifier:
mTerm:
mTermSecondary:
PrimaryTermModifier: 0
SecondaryTermModifier: 0
TermPrefix:
TermSuffix:
LocalizeOnAwake: 1
IgnoreRTL: 0
MaxCharactersInRTL: 0
IgnoreNumbersInRTL: 1
CorrectAlignmentForRTL: 1
AddSpacesToJoinedLanguages: 0
AllowLocalizedParameters: 1
AllowParameters: 1
TranslatedObjects: []
LocalizeEvent:
m_PersistentCalls:
m_Calls: []
AlwaysForceLocalize: 0
LocalizeCallBack:
Target: {fileID: 0}
MethodName:
mGUI_ShowReferences: 0
mGUI_ShowTems: 1
mGUI_ShowCallback: 0
mLocalizeTarget: {fileID: 0}
mLocalizeTargetName: I2.Loc.LocalizeTarget_TextMeshPro_UGUI
m_EditorClassIdentifier: Assembly-CSharp::Ichni.Localization.LocalizedTMPText
targetText: {fileID: 6504848274583113892}
stringReference:
m_TableReference:
m_TableCollectionName:
m_TableEntryReference:
m_KeyId: 0
m_Key:
m_FallbackState: 0
m_WaitForCompletion: 0
m_LocalVariables: []
references:
version: 2
RefIds: []
--- !u!1 &8247101538614965428
GameObject:
m_ObjectHideFlags: 0
@@ -791,7 +789,7 @@ GameObject:
- component: {fileID: 6471618131828051134}
- component: {fileID: 1874840276987377843}
m_Layer: 5
m_Name: Background (2)
m_Name: Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -893,7 +891,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 500, y: -350}
m_SizeDelta: {x: 800, y: 200}
m_SizeDelta: {x: 7, y: 200}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &2689290717058890741
MonoBehaviour:
@@ -907,8 +905,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 41fab833db1ccee4d95a84b1d56da81c, type: 3}
m_Name:
m_EditorClassIdentifier:
title:
subTitle:
titleBackground: {fileID: 1874840276987377843}
titleText: {fileID: 1722593142608310948}
subTitleText: {fileID: 6504848274583113892}

View File

@@ -1674,13 +1674,6 @@ MonoBehaviour:
closedMaskHorizontalPadding: 600
bodyEase: 21
railEase: 18
optionRevealDelay: 0
optionRevealDuration: 0.3
optionRevealEase: 18
optionRevealFadeEase: 17
optionRevealVerticalOffset: 100
optionCloseDuration: 0.2
optionCloseEase: 8
--- !u!1 &7367933445236546045
GameObject:
m_ObjectHideFlags: 0

View File

@@ -284,9 +284,9 @@ GameObject:
- component: {fileID: 5761584772908744712}
- component: {fileID: 4368242843966039409}
- component: {fileID: 1890038081481639440}
- component: {fileID: 5627854805848640511}
- component: {fileID: 2162142985987821472}
m_Layer: 5
m_Name: Title (1)
m_Name: Subtitle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -306,10 +306,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 2492005972512683987}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 100, y: 22.5}
m_SizeDelta: {x: 600, y: 25}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 225, y: -45}
m_SizeDelta: {x: 500, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4368242843966039409
CanvasRenderer:
@@ -370,9 +370,9 @@ MonoBehaviour:
m_fontSize: 24
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_enableAutoSizing: 1
m_fontSizeMin: 16
m_fontSizeMax: 24
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 512
@@ -412,7 +412,7 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &5627854805848640511
--- !u!114 &2162142985987821472
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -421,36 +421,22 @@ MonoBehaviour:
m_GameObject: {fileID: 4234607097852901317}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 344445a89b4f74a0e9a0a766903df87e, type: 3}
m_Script: {fileID: 11500000, guid: 209017a926f587a4394f52dc1e88a61e, type: 3}
m_Name:
m_EditorClassIdentifier:
mTerm:
mTermSecondary:
PrimaryTermModifier: 0
SecondaryTermModifier: 0
TermPrefix:
TermSuffix:
LocalizeOnAwake: 1
IgnoreRTL: 0
MaxCharactersInRTL: 0
IgnoreNumbersInRTL: 1
CorrectAlignmentForRTL: 1
AddSpacesToJoinedLanguages: 0
AllowLocalizedParameters: 1
AllowParameters: 1
TranslatedObjects: []
LocalizeEvent:
m_PersistentCalls:
m_Calls: []
AlwaysForceLocalize: 0
LocalizeCallBack:
Target: {fileID: 0}
MethodName:
mGUI_ShowReferences: 0
mGUI_ShowTems: 1
mGUI_ShowCallback: 0
mLocalizeTarget: {fileID: 0}
mLocalizeTargetName: I2.Loc.LocalizeTarget_TextMeshPro_UGUI
m_EditorClassIdentifier: Assembly-CSharp::Ichni.Localization.LocalizedTMPText
targetText: {fileID: 1890038081481639440}
stringReference:
m_TableReference:
m_TableCollectionName:
m_TableEntryReference:
m_KeyId: 0
m_Key:
m_FallbackState: 0
m_WaitForCompletion: 0
m_LocalVariables: []
references:
version: 2
RefIds: []
--- !u!1 &4532165800017552324
GameObject:
m_ObjectHideFlags: 0
@@ -462,7 +448,7 @@ GameObject:
- component: {fileID: 6825131731133969837}
- component: {fileID: 7956335752757046652}
- component: {fileID: 1436411705962800859}
- component: {fileID: 3988431615956575222}
- component: {fileID: 684422186442178476}
m_Layer: 5
m_Name: Title
m_TagString: Untagged
@@ -484,10 +470,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 2492005972512683987}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 100, y: 60}
m_SizeDelta: {x: 600, y: 50}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 225, y: 0}
m_SizeDelta: {x: 500, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7956335752757046652
CanvasRenderer:
@@ -545,8 +531,8 @@ MonoBehaviour:
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 48
m_fontSizeBase: 48
m_fontSize: 36
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
@@ -590,7 +576,7 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &3988431615956575222
--- !u!114 &684422186442178476
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -599,36 +585,22 @@ MonoBehaviour:
m_GameObject: {fileID: 4532165800017552324}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 344445a89b4f74a0e9a0a766903df87e, type: 3}
m_Script: {fileID: 11500000, guid: 209017a926f587a4394f52dc1e88a61e, type: 3}
m_Name:
m_EditorClassIdentifier:
mTerm:
mTermSecondary:
PrimaryTermModifier: 0
SecondaryTermModifier: 0
TermPrefix:
TermSuffix:
LocalizeOnAwake: 1
IgnoreRTL: 0
MaxCharactersInRTL: 0
IgnoreNumbersInRTL: 1
CorrectAlignmentForRTL: 1
AddSpacesToJoinedLanguages: 0
AllowLocalizedParameters: 1
AllowParameters: 1
TranslatedObjects: []
LocalizeEvent:
m_PersistentCalls:
m_Calls: []
AlwaysForceLocalize: 0
LocalizeCallBack:
Target: {fileID: 0}
MethodName:
mGUI_ShowReferences: 0
mGUI_ShowTems: 1
mGUI_ShowCallback: 0
mLocalizeTarget: {fileID: 0}
mLocalizeTargetName: I2.Loc.LocalizeTarget_TextMeshPro_UGUI
m_EditorClassIdentifier: Assembly-CSharp::Ichni.Localization.LocalizedTMPText
targetText: {fileID: 1436411705962800859}
stringReference:
m_TableReference:
m_TableCollectionName:
m_TableEntryReference:
m_KeyId: 0
m_Key:
m_FallbackState: 0
m_WaitForCompletion: 0
m_LocalVariables: []
references:
version: 2
RefIds: []
--- !u!1 &5069485678416699115
GameObject:
m_ObjectHideFlags: 0
@@ -666,7 +638,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -270, y: -25}
m_AnchoredPosition: {x: -220, y: -25}
m_SizeDelta: {x: 260, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &8246144680600107526
@@ -856,7 +828,7 @@ GameObject:
- component: {fileID: 3604784670401435254}
- component: {fileID: 144152155845289379}
m_Layer: 5
m_Name: Background (2)
m_Name: Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -1184,7 +1156,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 500, y: -350}
m_SizeDelta: {x: 800, y: 200}
m_SizeDelta: {x: 700, y: 200}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &5598452497064675529
MonoBehaviour:
@@ -1198,8 +1170,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 33444f8904d91374fb31960969da96ed, type: 3}
m_Name:
m_EditorClassIdentifier:
title:
subTitle:
titleBackground: {fileID: 144152155845289379}
titleText: {fileID: 1436411705962800859}
subTitleText: {fileID: 1890038081481639440}

View File

@@ -36,7 +36,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -200, y: -5}
m_AnchoredPosition: {x: -150, y: -5}
m_SizeDelta: {x: 400, y: 60}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4342668321050494381
@@ -132,7 +132,7 @@ GameObject:
- component: {fileID: 7629755617611759494}
- component: {fileID: 8007286970277077366}
- component: {fileID: 5643531126894557675}
- component: {fileID: 615774882970370581}
- component: {fileID: 2450372996589810395}
m_Layer: 5
m_Name: Text (TMP)
m_TagString: Untagged
@@ -226,20 +226,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -257,7 +260,7 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &615774882970370581
--- !u!114 &2450372996589810395
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -266,36 +269,22 @@ MonoBehaviour:
m_GameObject: {fileID: 5975257480353016332}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 344445a89b4f74a0e9a0a766903df87e, type: 3}
m_Script: {fileID: 11500000, guid: 209017a926f587a4394f52dc1e88a61e, type: 3}
m_Name:
m_EditorClassIdentifier:
mTerm:
mTermSecondary:
PrimaryTermModifier: 0
SecondaryTermModifier: 0
TermPrefix:
TermSuffix:
LocalizeOnAwake: 1
IgnoreRTL: 0
MaxCharactersInRTL: 0
IgnoreNumbersInRTL: 1
CorrectAlignmentForRTL: 1
AddSpacesToJoinedLanguages: 0
AllowLocalizedParameters: 1
AllowParameters: 1
TranslatedObjects: []
LocalizeEvent:
m_PersistentCalls:
m_Calls: []
AlwaysForceLocalize: 0
LocalizeCallBack:
Target: {fileID: 0}
MethodName:
mGUI_ShowReferences: 0
mGUI_ShowTems: 1
mGUI_ShowCallback: 0
mLocalizeTarget: {fileID: 0}
mLocalizeTargetName: I2.Loc.LocalizeTarget_TextMeshPro_UGUI
m_EditorClassIdentifier: Assembly-CSharp::Ichni.Localization.LocalizedTMPText
targetText: {fileID: 5643531126894557675}
stringReference:
m_TableReference:
m_TableCollectionName:
m_TableEntryReference:
m_KeyId: 0
m_Key:
m_FallbackState: 0
m_WaitForCompletion: 0
m_LocalVariables: []
references:
version: 2
RefIds: []
--- !u!1 &6338319702404413715
GameObject:
m_ObjectHideFlags: 0
@@ -307,7 +296,7 @@ GameObject:
- component: {fileID: 4809331135606521131}
- component: {fileID: 4610618812000335788}
- component: {fileID: 1722593142608310948}
- component: {fileID: 8878948156582783634}
- component: {fileID: 7103016005250617451}
m_Layer: 5
m_Name: Title
m_TagString: Untagged
@@ -329,10 +318,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 5668105170805566722}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 100, y: 60}
m_SizeDelta: {x: 600, y: 50}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 225, y: 0}
m_SizeDelta: {x: 500, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4610618812000335788
CanvasRenderer:
@@ -390,8 +379,8 @@ MonoBehaviour:
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 48
m_fontSizeBase: 48
m_fontSize: 36
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
@@ -401,20 +390,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -432,7 +424,7 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &8878948156582783634
--- !u!114 &7103016005250617451
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -441,36 +433,22 @@ MonoBehaviour:
m_GameObject: {fileID: 6338319702404413715}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 344445a89b4f74a0e9a0a766903df87e, type: 3}
m_Script: {fileID: 11500000, guid: 209017a926f587a4394f52dc1e88a61e, type: 3}
m_Name:
m_EditorClassIdentifier:
mTerm:
mTermSecondary:
PrimaryTermModifier: 0
SecondaryTermModifier: 0
TermPrefix:
TermSuffix:
LocalizeOnAwake: 1
IgnoreRTL: 0
MaxCharactersInRTL: 0
IgnoreNumbersInRTL: 1
CorrectAlignmentForRTL: 1
AddSpacesToJoinedLanguages: 0
AllowLocalizedParameters: 1
AllowParameters: 1
TranslatedObjects: []
LocalizeEvent:
m_PersistentCalls:
m_Calls: []
AlwaysForceLocalize: 0
LocalizeCallBack:
Target: {fileID: 0}
MethodName:
mGUI_ShowReferences: 0
mGUI_ShowTems: 1
mGUI_ShowCallback: 0
mLocalizeTarget: {fileID: 0}
mLocalizeTargetName: I2.Loc.LocalizeTarget_TextMeshPro_UGUI
m_EditorClassIdentifier: Assembly-CSharp::Ichni.Localization.LocalizedTMPText
targetText: {fileID: 1722593142608310948}
stringReference:
m_TableReference:
m_TableCollectionName:
m_TableEntryReference:
m_KeyId: 0
m_Key:
m_FallbackState: 0
m_WaitForCompletion: 0
m_LocalVariables: []
references:
version: 2
RefIds: []
--- !u!1 &7817226485700523307
GameObject:
m_ObjectHideFlags: 0
@@ -482,9 +460,9 @@ GameObject:
- component: {fileID: 8725596012907959197}
- component: {fileID: 8967739015609294999}
- component: {fileID: 6504848274583113892}
- component: {fileID: 5062037213869781326}
- component: {fileID: 3829299537931940282}
m_Layer: 5
m_Name: Title (1)
m_Name: Subtitle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -504,10 +482,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 5668105170805566722}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 100, y: 22.5}
m_SizeDelta: {x: 600, y: 25}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 225, y: -45}
m_SizeDelta: {x: 500, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8967739015609294999
CanvasRenderer:
@@ -568,28 +546,31 @@ MonoBehaviour:
m_fontSize: 24
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_enableAutoSizing: 1
m_fontSizeMin: 16
m_fontSizeMax: 24
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -607,7 +588,7 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &5062037213869781326
--- !u!114 &3829299537931940282
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -616,36 +597,22 @@ MonoBehaviour:
m_GameObject: {fileID: 7817226485700523307}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 344445a89b4f74a0e9a0a766903df87e, type: 3}
m_Script: {fileID: 11500000, guid: 209017a926f587a4394f52dc1e88a61e, type: 3}
m_Name:
m_EditorClassIdentifier:
mTerm:
mTermSecondary:
PrimaryTermModifier: 0
SecondaryTermModifier: 0
TermPrefix:
TermSuffix:
LocalizeOnAwake: 1
IgnoreRTL: 0
MaxCharactersInRTL: 0
IgnoreNumbersInRTL: 1
CorrectAlignmentForRTL: 1
AddSpacesToJoinedLanguages: 0
AllowLocalizedParameters: 1
AllowParameters: 1
TranslatedObjects: []
LocalizeEvent:
m_PersistentCalls:
m_Calls: []
AlwaysForceLocalize: 0
LocalizeCallBack:
Target: {fileID: 0}
MethodName:
mGUI_ShowReferences: 0
mGUI_ShowTems: 1
mGUI_ShowCallback: 0
mLocalizeTarget: {fileID: 0}
mLocalizeTargetName: I2.Loc.LocalizeTarget_TextMeshPro_UGUI
m_EditorClassIdentifier: Assembly-CSharp::Ichni.Localization.LocalizedTMPText
targetText: {fileID: 6504848274583113892}
stringReference:
m_TableReference:
m_TableCollectionName:
m_TableEntryReference:
m_KeyId: 0
m_Key:
m_FallbackState: 0
m_WaitForCompletion: 0
m_LocalVariables: []
references:
version: 2
RefIds: []
--- !u!1 &8247101538614965428
GameObject:
m_ObjectHideFlags: 0
@@ -658,7 +625,7 @@ GameObject:
- component: {fileID: 6471618131828051134}
- component: {fileID: 1874840276987377843}
m_Layer: 5
m_Name: Background (2)
m_Name: Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -759,7 +726,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 500, y: -350}
m_SizeDelta: {x: 800, y: 200}
m_SizeDelta: {x: 700, y: 200}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &4685798301312089359
MonoBehaviour:
@@ -773,10 +740,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: e4d6bf33a04cb664da50cab6630146a2, type: 3}
m_Name:
m_EditorClassIdentifier:
title:
subTitle:
titleBackground: {fileID: 1874840276987377843}
titleText: {fileID: 1722593142608310948}
subTitleText: {fileID: 6504848274583113892}
button: {fileID: 2795962994147138334}
buttonText: {fileID: 5643531126894557675}

View File

@@ -113,8 +113,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 347.49997, y: -25}
m_SizeDelta: {x: 105, y: 92}
m_AnchoredPosition: {x: 300, y: -25}
m_SizeDelta: {x: 84, y: 73.6}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5475369952269313221
CanvasRenderer:
@@ -223,7 +223,7 @@ GameObject:
- component: {fileID: 1338397591688871203}
- component: {fileID: 2770410982563221573}
- component: {fileID: 4944485236584090101}
- component: {fileID: 2221739217115912236}
- component: {fileID: 7568069479347153337}
m_Layer: 5
m_Name: SubtitleText
m_TagString: Untagged
@@ -245,10 +245,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 805052780902826394}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 100, y: 22.5}
m_SizeDelta: {x: 600, y: 25}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 225, y: -45}
m_SizeDelta: {x: 500, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2770410982563221573
CanvasRenderer:
@@ -309,28 +309,31 @@ MonoBehaviour:
m_fontSize: 24
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_enableAutoSizing: 1
m_fontSizeMin: 16
m_fontSizeMax: 24
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -348,7 +351,7 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &2221739217115912236
--- !u!114 &7568069479347153337
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -357,36 +360,22 @@ MonoBehaviour:
m_GameObject: {fileID: 3073164164041488105}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 344445a89b4f74a0e9a0a766903df87e, type: 3}
m_Script: {fileID: 11500000, guid: 209017a926f587a4394f52dc1e88a61e, type: 3}
m_Name:
m_EditorClassIdentifier:
mTerm:
mTermSecondary:
PrimaryTermModifier: 0
SecondaryTermModifier: 0
TermPrefix:
TermSuffix:
LocalizeOnAwake: 1
IgnoreRTL: 0
MaxCharactersInRTL: 0
IgnoreNumbersInRTL: 1
CorrectAlignmentForRTL: 1
AddSpacesToJoinedLanguages: 0
AllowLocalizedParameters: 1
AllowParameters: 1
TranslatedObjects: []
LocalizeEvent:
m_PersistentCalls:
m_Calls: []
AlwaysForceLocalize: 0
LocalizeCallBack:
Target: {fileID: 0}
MethodName:
mGUI_ShowReferences: 0
mGUI_ShowTems: 1
mGUI_ShowCallback: 0
mLocalizeTarget: {fileID: 0}
mLocalizeTargetName: I2.Loc.LocalizeTarget_TextMeshPro_UGUI
m_EditorClassIdentifier: Assembly-CSharp::Ichni.Localization.LocalizedTMPText
targetText: {fileID: 4944485236584090101}
stringReference:
m_TableReference:
m_TableCollectionName:
m_TableEntryReference:
m_KeyId: 0
m_Key:
m_FallbackState: 0
m_WaitForCompletion: 0
m_LocalVariables: []
references:
version: 2
RefIds: []
--- !u!1 &3348868652654409574
GameObject:
m_ObjectHideFlags: 0
@@ -423,7 +412,7 @@ RectTransform:
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: -26}
m_SizeDelta: {x: 660, y: 40}
m_SizeDelta: {x: 560, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4574769679679527751
CanvasRenderer:
@@ -512,7 +501,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: 70, y: -26}
m_SizeDelta: {x: 660, y: 20}
m_SizeDelta: {x: 560, y: 20}
m_Pivot: {x: 0, y: 0.5}
--- !u!222 &8566918414660364278
CanvasRenderer:
@@ -563,7 +552,7 @@ GameObject:
- component: {fileID: 8594070919350220040}
- component: {fileID: 429067634825693867}
- component: {fileID: 4853066672577341755}
- component: {fileID: 3838465996500803117}
- component: {fileID: 2077364037819248331}
m_Layer: 5
m_Name: TitleText
m_TagString: Untagged
@@ -585,10 +574,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 805052780902826394}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 100, y: 60}
m_SizeDelta: {x: 600, y: 50}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 225, y: 0}
m_SizeDelta: {x: 500, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &429067634825693867
CanvasRenderer:
@@ -618,7 +607,9 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: Title
m_text: 'Title
'
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 87c1b020037c81841b3d98dd497cbdeb, type: 2}
m_sharedMaterial: {fileID: -5812992765432063453, guid: 87c1b020037c81841b3d98dd497cbdeb,
@@ -646,8 +637,8 @@ MonoBehaviour:
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 48
m_fontSizeBase: 48
m_fontSize: 36
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
@@ -657,20 +648,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -688,7 +682,7 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &3838465996500803117
--- !u!114 &2077364037819248331
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -697,36 +691,22 @@ MonoBehaviour:
m_GameObject: {fileID: 5701871721980854376}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 344445a89b4f74a0e9a0a766903df87e, type: 3}
m_Script: {fileID: 11500000, guid: 209017a926f587a4394f52dc1e88a61e, type: 3}
m_Name:
m_EditorClassIdentifier:
mTerm:
mTermSecondary:
PrimaryTermModifier: 0
SecondaryTermModifier: 0
TermPrefix:
TermSuffix:
LocalizeOnAwake: 1
IgnoreRTL: 0
MaxCharactersInRTL: 0
IgnoreNumbersInRTL: 1
CorrectAlignmentForRTL: 1
AddSpacesToJoinedLanguages: 0
AllowLocalizedParameters: 1
AllowParameters: 1
TranslatedObjects: []
LocalizeEvent:
m_PersistentCalls:
m_Calls: []
AlwaysForceLocalize: 0
LocalizeCallBack:
Target: {fileID: 0}
MethodName:
mGUI_ShowReferences: 0
mGUI_ShowTems: 1
mGUI_ShowCallback: 0
mLocalizeTarget: {fileID: 0}
mLocalizeTargetName: I2.Loc.LocalizeTarget_TextMeshPro_UGUI
m_EditorClassIdentifier: Assembly-CSharp::Ichni.Localization.LocalizedTMPText
targetText: {fileID: 4853066672577341755}
stringReference:
m_TableReference:
m_TableCollectionName:
m_TableEntryReference:
m_KeyId: 0
m_Key:
m_FallbackState: 0
m_WaitForCompletion: 0
m_LocalVariables: []
references:
version: 2
RefIds: []
--- !u!1 &6153556573277593716
GameObject:
m_ObjectHideFlags: 0
@@ -762,7 +742,7 @@ RectTransform:
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: -25}
m_SizeDelta: {x: 680, y: 100}
m_SizeDelta: {x: 580, y: 80}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4017415550083154980
CanvasRenderer:
@@ -838,8 +818,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -347.5, y: -25}
m_SizeDelta: {x: 105, y: 92}
m_AnchoredPosition: {x: -300, y: -25}
m_SizeDelta: {x: 84, y: 73.6}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5121588018245264755
CanvasRenderer:
@@ -1041,20 +1021,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -1113,7 +1096,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 500, y: -350}
m_SizeDelta: {x: 800, y: 200}
m_SizeDelta: {x: 700, y: 200}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &4163616438317721823
MonoBehaviour:
@@ -1127,8 +1110,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: f7db12c4a04bb4249a4916541b6d0e5d, type: 3}
m_Name:
m_EditorClassIdentifier:
title:
subTitle:
titleBackground: {fileID: 1120286406375814519}
titleText: {fileID: 4853066672577341755}
subTitleText: {fileID: 4944485236584090101}

View File

@@ -18,7 +18,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!224 &7895181244729415272
RectTransform:
m_ObjectHideFlags: 0
@@ -68,7 +68,7 @@ MonoBehaviour:
m_Calls: []
m_text: Tutorial
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 73f9a9bb620a2b040ab7347b390452fe, type: 2}
m_fontAsset: {fileID: 11400000, guid: 87c1b020037c81841b3d98dd497cbdeb, type: 2}
m_sharedMaterial: {fileID: 1291443754377433884, guid: 73f9a9bb620a2b040ab7347b390452fe,
type: 2}
m_fontSharedMaterials: []
@@ -136,7 +136,7 @@ MonoBehaviour:
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_hasFontAssetChanged: 1
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!225 &3155030838568361280
@@ -307,8 +307,8 @@ MonoBehaviour:
m_Calls: []
m_text: Tutorial
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 73f9a9bb620a2b040ab7347b390452fe, type: 2}
m_sharedMaterial: {fileID: 1291443754377433884, guid: 73f9a9bb620a2b040ab7347b390452fe,
m_fontAsset: {fileID: 11400000, guid: 87c1b020037c81841b3d98dd497cbdeb, type: 2}
m_sharedMaterial: {fileID: -5812992765432063453, guid: 87c1b020037c81841b3d98dd497cbdeb,
type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}

View File

@@ -319,7 +319,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!224 &9095470796084918386
RectTransform:
m_ObjectHideFlags: 0

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
using System.Collections;
using System.Collections.Generic;
using I2.Loc;
using UnityEngine;
using Ichni.Localization;
using Ichni.UI;
using Michsky.MUIP;
using Sirenix.OdinInspector;
@@ -23,6 +23,10 @@ namespace Ichni.RhythmGame
public Image characterImage;
public TMP_Text characterNameText;
public TMP_Text sentenceText;
[Tooltip("角色名的 Unity Localization 文本。应配置 UI/ui_summary_soullies_name。")]
public LocalizedTMPText characterNameLocalizedText;
[Tooltip("角色短句的 Unity Localization 文本。应配置 UI/ui_summary_soullies_sentence_0。")]
public LocalizedTMPText sentenceLocalizedText;
[Title("Difficulty")]
public TMP_Text difficultyText;
@@ -61,8 +65,12 @@ namespace Ichni.RhythmGame
illustrationImage.sprite = info.song.illustration;
characterNameText.GetComponent<Localize>().SetTerm("Characters/Soullies");
sentenceText.GetComponent<Localize>().SetTerm("Sentences/Soullies_Summary_Sentence_0");
// Summary 页面没有再依赖 I2 Term。迁移期间允许旧场景先不绑定新字段
// 此时不会中断结算页面;完成 Inspector 配置后,两个 LocalizedTMPText 会自动跟随 Locale 切换。
characterNameLocalizedText ??= characterNameText.GetComponent<LocalizedTMPText>();
sentenceLocalizedText ??= sentenceText.GetComponent<LocalizedTMPText>();
characterNameLocalizedText?.RefreshText();
sentenceLocalizedText?.RefreshText();
difficultyText.text = info.difficulty.GetDifficultyName();
levelText.text = info.difficulty.difficultyValue.ToString();
@@ -89,4 +97,4 @@ namespace Ichni.RhythmGame
backButton.onClick.AddListener(GameManager.ReturnToMenu);
}
}
}
}

View File

@@ -0,0 +1,208 @@
using TMPro;
using UnityEngine;
using UnityEngine.Localization;
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.Localization;
using UnityEngine.Localization.Settings;
using UnityEngine.Localization.Tables;
#endif
namespace Ichni.Localization
{
/// <summary>
/// 将静态 <see cref="TMP_Text"/> 与 Unity Localization 的
/// <see cref="LocalizedString"/> 绑定。
/// <para>
/// 组件启用时订阅 <see cref="LocalizedString.StringChanged"/>。因此切换 Locale
/// 或在 Play Mode 中修改 Inspector 里的 String Reference 后TMP 文本会自动更新。
/// </para>
/// <para>
/// Inspector 自带的 String Reference 可预览各 Locale 的文本。Edit Mode 中变更引用时,
/// 本组件只将项目默认 Locale 的文本同步到 TMP_Text便于直接预览不保存回退文本
/// 也不提供额外的编辑器自检功能。
/// </para>
/// </summary>
[DisallowMultipleComponent]
[RequireComponent(typeof(TMP_Text))]
[AddComponentMenu("Localization/Localized TMP Text")]
public sealed class LocalizedTMPText : MonoBehaviour
{
[SerializeField]
[Tooltip("要更新的 TMP 文本。留空时会自动使用当前 GameObject 上的 TMP_Text。")]
private TMP_Text targetText;
[SerializeField]
[Tooltip("在 Inspector 中选择 String Table Collection 和对应的 Entry。")]
private LocalizedString stringReference = new LocalizedString();
private bool _isListening;
/// <summary>当前绑定的 TMP 文本。</summary>
public TMP_Text TargetText => targetText;
/// <summary>当前使用的 Unity Localization 字符串引用。</summary>
public LocalizedString StringReference => stringReference;
/// <summary>
/// 在运行时替换当前文本使用的 String Reference。
/// <para>
/// 该接口主要供动态生成的 UI 使用,例如 Dropdown 的选项 Item。替换前会先解除旧引用的
/// <see cref="LocalizedString.StringChanged"/> 订阅,再为新引用建立订阅,因此不会残留
/// 旧语言表的回调,也不会重复监听。
/// </para>
/// </summary>
public void SetStringReference(LocalizedString reference)
{
StopListening();
stringReference = reference ?? new LocalizedString();
EnsureTargetText();
if (isActiveAndEnabled)
{
StartListening();
}
#if UNITY_EDITOR
if (!Application.isPlaying)
{
ApplyEditorPreviewText();
}
#endif
}
private void Awake()
{
EnsureTargetText();
}
private void OnValidate()
{
EnsureTargetText();
if (Application.isPlaying)
{
// Play Mode 中通过 Inspector 更换 Table 或 Entry 后立即刷新。
if (_isListening)
{
stringReference?.RefreshString();
}
return;
}
#if UNITY_EDITOR
ApplyEditorPreviewText();
#endif
}
private void OnEnable()
{
EnsureTargetText();
StartListening();
}
private void OnDisable()
{
StopListening();
}
private void OnDestroy()
{
StopListening();
}
/// <summary>
/// 主动请求重新解析当前 String Reference。
/// 通常仅在运行时修改 Smart String 参数后调用;普通语言切换会自动刷新。
/// </summary>
public void RefreshText()
{
if (_isListening)
{
stringReference.RefreshString();
}
}
private void StopListening()
{
if (!_isListening || stringReference == null)
{
return;
}
stringReference.StringChanged -= ApplyText;
_isListening = false;
}
/// <summary>
/// 为当前 String Reference 建立语言变化监听。
/// Unity Localization 会在首次订阅时请求当前 Locale 的文本;这里不使用
/// <c>WaitForCompletion</c>,以避免阻塞主线程或干扰 Addressables 队列。
/// </summary>
private void StartListening()
{
if (_isListening || stringReference == null || stringReference.IsEmpty)
{
return;
}
stringReference.StringChanged += ApplyText;
_isListening = true;
}
private void EnsureTargetText()
{
if (targetText == null)
{
targetText = GetComponent<TMP_Text>();
}
}
private void ApplyText(string localizedText)
{
EnsureTargetText();
if (targetText != null)
{
targetText.text = localizedText ?? string.Empty;
}
}
#if UNITY_EDITOR
/// <summary>
/// 在编辑器中将项目默认 Locale 的已导入文本同步到 TMP_Text。
/// 这里直接读取 String Table 资产,不调用异步 Localization API因而不会加载 Addressables。
/// </summary>
private void ApplyEditorPreviewText()
{
if (targetText == null || stringReference == null || stringReference.IsEmpty)
{
return;
}
Locale projectLocale = LocalizationSettings.ProjectLocale;
StringTableCollection tableCollection =
LocalizationEditorSettings.GetStringTableCollection(stringReference.TableReference);
StringTable table = projectLocale == null
? null
: tableCollection?.GetTable(projectLocale.Identifier) as StringTable;
StringTableEntry entry = table?.GetEntryFromReference(stringReference.TableEntryReference);
if (entry == null)
{
return;
}
string previewText = entry.LocalizedValue ?? string.Empty;
if (targetText.text == previewText)
{
return;
}
targetText.text = previewText;
EditorUtility.SetDirty(targetText);
}
#endif
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 209017a926f587a4394f52dc1e88a61e

View File

@@ -1,11 +1,56 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Ichni.Localization;
using Ichni.Menu.UI;
using Ichni.UI;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Localization;
using UnityEngine.Localization.Tables;
namespace Ichni.Story.UI
{
/// <summary>
/// 运行时弹窗的一段本地化文本请求。
/// <para>请求进入队列时不会立即翻译;<see cref="MessageUIPage"/> 即将显示该弹窗时才读取当前 Locale
/// 因而不会因异步加载导致 FIFO 顺序错乱,也不会把语言逻辑散落到各业务调用方。</para>
/// <para>动态参数统一使用 Smart String 的位置参数,例如 <c>{0}</c>、<c>{1}</c>。</para>
/// </summary>
public readonly struct LocalizedPopupText
{
public readonly TableReference tableReference;
public readonly string entryKey;
public readonly object[] arguments;
public LocalizedPopupText(TableReference tableReference, string entryKey, params object[] arguments)
{
this.tableReference = tableReference;
this.entryKey = entryKey;
this.arguments = arguments;
}
/// <summary>异步解析当前 Locale 的文本;缺失时显示 Key便于开发阶段定位错误配置。</summary>
public Task<string> ResolveAsync() =>
LocalizationTextService.ResolveAsync(tableReference, entryKey, entryKey, arguments);
}
/// <summary>
/// SelectionBox 的本地化按钮定义。每个按钮可以独立指定 String Table
/// 因此业务专用操作与 UI 通用操作(如“取消”)可复用各自的词条。
/// </summary>
public readonly struct LocalizedSelectionBoxOption
{
public readonly LocalizedPopupText label;
public readonly UnityAction action;
public LocalizedSelectionBoxOption(LocalizedPopupText label, UnityAction action)
{
this.label = label;
this.action = action;
}
}
/// <summary>
/// 剧情与菜单共用的弹窗页面。
/// MessageBox 与 SelectionBox 共用同一遮罩、容器和显示队列:两者不会重叠,
@@ -39,6 +84,10 @@ namespace Ichni.Story.UI
public string content;
public MessageBox messagePrefab;
public List<SelectionBoxOption> selectionOptions;
public bool useLocalizedText;
public LocalizedPopupText localizedTitle;
public LocalizedPopupText localizedContent;
public List<LocalizedSelectionBoxOption> localizedSelectionOptions;
}
private readonly Queue<PendingPopup> _popupQueue = new();
@@ -69,12 +118,13 @@ namespace Ichni.Story.UI
/// <summary>
/// 将歌曲解锁提示加入弹窗队列。
/// <param name="songDisplayName">玩家可见的歌曲名称;调用方不得传入内部 Unlock Key。</param>
/// </summary>
public void ShowUnlockMessage(string songUnlockKey)
public void ShowUnlockMessage(string songDisplayName)
{
string title = "New Song Unlocked!";
string content = $"You have unlocked the song: {songUnlockKey}!";
EnqueueMessage(title, content, defaultMessageBoxPrefab);
ShowLocalizedMessage(
new LocalizedPopupText("Message", "system_unlock_song_title"),
new LocalizedPopupText("Message", "system_unlock_song_content", songDisplayName));
}
/// <summary>
@@ -85,6 +135,32 @@ namespace Ichni.Story.UI
EnqueueMessage(title, content, defaultMessageBoxPrefab);
}
/// <summary>
/// 将本地化 MessageBox 加入队列。文本会在该弹窗真正显示前才按当前 Locale 解析;
/// 对于含动态参数的词条,请使用 <see cref="LocalizedPopupText"/> 的位置参数构造函数。
/// </summary>
public void ShowLocalizedMessage(LocalizedPopupText title, LocalizedPopupText content,
MessageBox prefab = null)
{
MessageBox targetPrefab = prefab ?? defaultMessageBoxPrefab;
if (targetPrefab == null)
{
Debug.LogError("[MessageUIPage] 没有可用的 MessageBox Prefab无法显示本地化消息。");
return;
}
_popupQueue.Enqueue(new PendingPopup
{
type = PopupType.Message,
messagePrefab = targetPrefab,
useLocalizedText = true,
localizedTitle = title,
localizedContent = content
});
BeginQueueIfNeeded();
}
/// <summary>
/// Inspector 专用的运行时调试入口。
/// 通过正常队列创建一条基础测试文本,因此可以同时验证新 Prefab 的布局、
@@ -162,6 +238,40 @@ namespace Ichni.Story.UI
return true;
}
/// <summary>
/// 将本地化 SelectionBox 加入队列。每个选项的标签单独保存本地化引用,
/// 因此“进入教程”“跳过教程”等业务按钮不会被误替换为通用的“确定/取消”。
/// </summary>
public bool ShowLocalizedSelectionBox(
LocalizedPopupText title,
LocalizedPopupText content,
IReadOnlyList<LocalizedSelectionBoxOption> options)
{
if (defaultSelectionBoxPrefab == null)
{
Debug.LogError("[MessageUIPage] 未配置 defaultSelectionBoxPrefab无法显示本地化选项框。");
return false;
}
if (options == null || options.Count == 0)
{
Debug.LogWarning("[MessageUIPage] 未提供任何本地化 SelectionBoxOption忽略空选项框。");
return false;
}
_popupQueue.Enqueue(new PendingPopup
{
type = PopupType.Selection,
useLocalizedText = true,
localizedTitle = title,
localizedContent = content,
localizedSelectionOptions = new List<LocalizedSelectionBoxOption>(options)
});
BeginQueueIfNeeded();
return true;
}
/// <summary>
/// 将指定消息入队。如果是空闲状态,则唤醒大页面并开始处理队列。
/// </summary>
@@ -202,7 +312,7 @@ namespace Ichni.Story.UI
/// <summary>
/// 从队列中取出一个并实例化显示。
/// </summary>
private void ShowNextInQueue()
private async void ShowNextInQueue()
{
if (_popupQueue.Count == 0)
{
@@ -215,6 +325,11 @@ namespace Ichni.Story.UI
}
PendingPopup popup = _popupQueue.Dequeue();
if (popup.useLocalizedText)
{
popup = await ResolveLocalizedPopupAsync(popup);
}
if (popup.type == PopupType.Selection)
{
ShowSelectionPopup(popup);
@@ -224,6 +339,30 @@ namespace Ichni.Story.UI
ShowMessagePopup(popup);
}
/// <summary>
/// 按 Popup 自己的请求依次解析标题、正文与按钮。该方法只由队列消费端调用,
/// 所以即使 String Table 仍在异步加载,也不会打乱此前入队的弹窗顺序。
/// </summary>
private static async Task<PendingPopup> ResolveLocalizedPopupAsync(PendingPopup popup)
{
popup.title = await popup.localizedTitle.ResolveAsync();
popup.content = await popup.localizedContent.ResolveAsync();
if (popup.type != PopupType.Selection || popup.localizedSelectionOptions == null)
{
return popup;
}
popup.selectionOptions = new List<SelectionBoxOption>(popup.localizedSelectionOptions.Count);
foreach (LocalizedSelectionBoxOption localizedOption in popup.localizedSelectionOptions)
{
string label = await localizedOption.label.ResolveAsync();
popup.selectionOptions.Add(new SelectionBoxOption(label, localizedOption.action));
}
return popup;
}
private void ShowMessagePopup(PendingPopup popup)
{
if (popup.messagePrefab == null)

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.Localization;
namespace Ichni.Story
{
@@ -147,9 +148,9 @@ namespace Ichni.Story
[FoldoutGroup("$EditorHeader/Text Content")]
[ShowIf("blockType", StoryBlockType.Text)]
[LabelText("Title Key")]
[Tooltip("该 TextBlock 标题使用的 Unity Localization Entry Key留空时视觉层使用 Block ID 作为开发阶段回退。")]
public string titleKey;
[LabelText("Title")]
[Tooltip("该 TextBlock 的 Unity Localization String Reference。请在此直接选择 String Table 与 Entry留空时视觉层使用 Block ID 作为开发阶段回退。")]
public LocalizedString title = new LocalizedString();
/// <summary>
/// TextBlock 的视觉和叙事层级。Important 用于主线转折与后续 checkpoint
@@ -229,7 +230,9 @@ namespace Ichni.Story
{
string title = blockType switch
{
StoryBlockType.Text => titleKey,
StoryBlockType.Text => this.title != null && !this.title.IsEmpty
? this.title.TableEntryReference.ToString()
: null,
StoryBlockType.Song => songName,
StoryBlockType.Tutorial => tutorialName,
_ => null

View File

@@ -3,7 +3,9 @@ using System.Collections.Generic;
using System.Linq;
using Sirenix.OdinInspector;
using UnityEditor;
using UnityEditor.Localization;
using UnityEngine;
using UnityEngine.Localization;
namespace Ichni.Story
{
@@ -146,10 +148,7 @@ namespace Ichni.Story
issues.Add($"[Error] Timeline Marker '{marker.markerId}' 的 Anchor Block '{marker.anchorBlockId}' 不是 TextBlock。");
}
if (string.IsNullOrWhiteSpace(marker.labelKey))
{
issues.Add($"[Warning] Timeline Marker '{marker.markerId}' 未配置 Label Key。");
}
ValidateLocalizedString(marker.label, $"Timeline Marker '{marker.markerId}' Label", issues);
}
ValidateTimelineMarkerAnchors(reachableBlockIds, issues);
@@ -203,8 +202,10 @@ namespace Ichni.Story
switch (block.blockType)
{
case StoryBlockType.Text when string.IsNullOrWhiteSpace(block.yarnNodeName):
issues.Add($"[Warning] TextBlock '{block.blockId}' 未配置 Yarn Node。");
case StoryBlockType.Text:
if (string.IsNullOrWhiteSpace(block.yarnNodeName))
issues.Add($"[Warning] TextBlock '{block.blockId}' 未配置 Yarn Node。");
ValidateLocalizedString(block.title, $"TextBlock '{block.blockId}' Title", issues);
break;
case StoryBlockType.Song when string.IsNullOrWhiteSpace(block.songName):
issues.Add($"[Warning] SongBlock '{block.blockId}' 未配置 Song ID。");
@@ -295,6 +296,36 @@ namespace Ichni.Story
}
}
/// <summary>
/// 检查 LocalizedString 是否已选择有效的 String Table 与 Entry。
/// 只读取 Unity Localization 的 Shared Table Data不加载 Addressables也不修改资产
/// 因此可在 StoryData Inspector 中尽早发现 CSV 尚未导入或引用错误。
/// </summary>
private static void ValidateLocalizedString(
LocalizedString reference,
string owner,
List<string> issues)
{
if (reference == null || reference.IsEmpty)
{
issues.Add($"[Warning] {owner} 未配置 LocalizedString。");
return;
}
StringTableCollection tableCollection =
LocalizationEditorSettings.GetStringTableCollection(reference.TableReference);
if (tableCollection?.SharedData == null)
{
issues.Add($"[Error] {owner} 引用的 String Table '{reference.TableReference}' 不存在或无法读取 Shared Table Data。");
return;
}
if (tableCollection.SharedData.GetEntryFromReference(reference.TableEntryReference) == null)
{
issues.Add($"[Error] {owner} 引用的 Entry '{reference.TableEntryReference}' 不存在于 String Table '{tableCollection.TableCollectionName}'。");
}
}
private HashSet<string> ValidateStoryGraph(HashSet<string> blockIds, List<string> issues)
{
Dictionary<string, List<string>> adjacency = new Dictionary<string, List<string>>();

View File

@@ -1,6 +1,7 @@
using System;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.Localization;
namespace Ichni.Story
{
@@ -8,8 +9,8 @@ namespace Ichni.Story
/// 一个章节 Timeline 标记的静态定义。
/// <para>它不保存独立的横坐标:运行时始终跟随锚定 Block 的 <c>gridColumn</c>
/// 使时间轴与剧情树在横向拖动时保持对齐。</para>
/// <para>显示文本和 ID 使用 Unity Localization 的 Entry Key本阶段不绑定具体 String Table
/// 以便后续统一迁移本地化系统时集中配置。</para>
/// <para>显示文本直接使用 <see cref="LocalizedString"/>,因此可在 Inspector 中选择
/// String Table 与 Entry并预览各语言的值。</para>
/// </summary>
[Serializable]
[InlineProperty]
@@ -37,13 +38,13 @@ namespace Ichni.Story
public string anchorBlockId;
/// <summary>
/// Timeline 上显示的本地化文本 Key。通常用于时间描述,也可用于特殊叙事文本。
/// Timeline 上显示的本地化文本。通常用于时间描述,也可用于特殊叙事文本。
/// </summary>
[HorizontalGroup("Identity")]
[LabelText("Label Key")]
[LabelWidth(54)]
[Tooltip("Timeline 上显示的 Unity Localization Entry Key通常用于时间或特殊叙事文本。")]
public string labelKey;
[LabelText("Label")]
[LabelWidth(40)]
[Tooltip("Timeline 上显示的 Unity Localization String Reference。请在此直接选择对应 String Table 与 Entry。")]
public LocalizedString label = new LocalizedString();
/// <summary>
/// 是否参与章节主线进度百分比计算。支线或纯装饰性时间标记应关闭此项。

View File

@@ -3,6 +3,8 @@ using Ichni.Menu.UI;
using Ichni.Story.UI;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Tables;
namespace Ichni.Story
{
@@ -13,6 +15,9 @@ namespace Ichni.Story
/// </summary>
public static class TutorialFlowController
{
/// <summary>教程确认弹窗统一使用 Message String Table避免业务代码内嵌可见文案。</summary>
private static readonly TableReference MessageTable = "Message";
/// <summary>
/// 由 <see cref="UI.TutorialBlockView"/> 点击时调用。配置无效或 MessageUIPage 未配置时只报错,不修改剧情进度。
/// </summary>
@@ -32,14 +37,18 @@ namespace Ichni.Story
}
// TutorialFlowController 只描述“有哪些选择、各自触发什么效果”;
// 具体按钮由通用 SelectionBox 在运行时生成,后续其它系统可复用同一 UI
messageUIPage.ShowSelectionBox(
tutorialBlock.tutorialName,
string.Empty,
new List<SelectionBoxOption>
// 具体按钮由通用 SelectionBox 在运行时生成,且按钮文案与标题均由 Message 表解析
messageUIPage.ShowLocalizedSelectionBox(
new LocalizedPopupText(MessageTable, "system_tutorial_entry_title"),
new LocalizedPopupText(MessageTable, "system_tutorial_entry_content"),
new List<LocalizedSelectionBoxOption>
{
new("游玩教程", () => PlayTutorial(tutorialBlock, chapter, song, difficulty)),
new("跳过教程", () => SkipTutorial(tutorialBlock))
new(
new LocalizedPopupText(MessageTable, "system_tutorial_enter"),
() => PlayTutorial(tutorialBlock, chapter, song, difficulty)),
new(
new LocalizedPopupText(MessageTable, "system_tutorial_skip"),
() => SkipTutorial(tutorialBlock))
});
}

View File

@@ -1,12 +1,9 @@
using System;
using System.Collections.Generic;
using Ichni.Localization;
using Ichni.Menu.UI;
using TMPro;
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
using UnityEngine.Localization.Tables;
using UnityEngine.UI;
namespace Ichni.Story.UI
@@ -39,15 +36,13 @@ namespace Ichni.Story.UI
[Tooltip("自动在左右各扩展一个刻度周期,保证刻度条循环平移时不会从 Timeline 边缘露出空白。")]
public bool expandTickRepeatRect = true;
[Header("Localization")]
[Tooltip("StoryTimeline 的 Unity Localization String Table。Marker.labelKey 在该 Table 中查找。")]
public TableReference localizationTable;
private sealed class RuntimeMarker
{
public StoryTimelineMarkerDefinition definition;
public StoryBlockView anchorView;
public StoryTimelineMarkerView view;
public string localizedLabel;
public LocalizedString.ChangeHandler localizedLabelChanged;
}
private readonly List<RuntimeMarker> _markers = new List<RuntimeMarker>();
@@ -69,7 +64,6 @@ namespace Ichni.Story.UI
private void OnEnable()
{
LocalizationSettings.SelectedLocaleChanged += OnSelectedLocaleChanged;
SubscribeToStoryScrollRect();
// StoryPage 从对话界面返回后Canvas 与 StoryTree 会在同一帧重新启用。
@@ -79,7 +73,6 @@ namespace Ichni.Story.UI
private void OnDisable()
{
LocalizationSettings.SelectedLocaleChanged -= OnSelectedLocaleChanged;
UnsubscribeFromStoryScrollRect();
}
@@ -124,6 +117,7 @@ namespace Ichni.Story.UI
foreach (RuntimeMarker marker in _markers)
{
UnbindLocalizedLabel(marker);
if (marker.view != null)
{
Destroy(marker.view.gameObject);
@@ -356,16 +350,19 @@ namespace Ichni.Story.UI
StoryTimelineMarkerView view = Instantiate(markerPrefab, markerContainer);
view.name = $"StoryTimelineMarker_{marker.markerId}";
view.SetLabel(GetLocalizedLabel(marker.labelKey));
RuntimeMarker runtimeMarker = new RuntimeMarker
{
definition = marker,
anchorView = anchorView,
view = view
view = view,
localizedLabel = marker.markerId
};
view.BindClick(() => RequestRollback(runtimeMarker));
_markers.Add(runtimeMarker);
// LocalizedString 首次读取是异步的;先显示稳定 Marker ID避免 Prefab 默认文字短暂闪现。
view.SetLabel(runtimeMarker.localizedLabel);
BindLocalizedLabel(runtimeMarker);
return true;
}
@@ -388,48 +385,52 @@ namespace Ichni.Story.UI
return;
}
string markerLabel = GetLocalizedLabel(marker.definition.labelKey);
messageUIPage.ShowSelectionBox(
"重开本章节",
$"将重置“{markerLabel}”所在列及其之后的剧情选择与进度。歌曲成绩、解锁内容、设置和其它章节不会受到影响。",
new List<SelectionBoxOption>
string markerLabel = marker.localizedLabel;
messageUIPage.ShowLocalizedSelectionBox(
new LocalizedPopupText("Message", "system_rollback_chapter_title"),
new LocalizedPopupText("Message", "system_rollback_chapter_content", markerLabel),
new List<LocalizedSelectionBoxOption>
{
new SelectionBoxOption("重开此时间点", () => _treeController.TryRollbackToMarker(marker.definition.markerId)),
new SelectionBoxOption("取消", () => { })
new LocalizedSelectionBoxOption(
new LocalizedPopupText("Message", "system_rollback_confirm"),
() => _treeController.TryRollbackToMarker(marker.definition.markerId)),
new LocalizedSelectionBoxOption(
new LocalizedPopupText("UI", "ui_common_cancel"),
() => { })
});
}
/// <summary>
/// 使用 StoryTimeline 指定的 Unity Localization String Table 解析 Label Key。
/// String Table 或条目尚未配置时回退显示 Key确保开发阶段仍能从 UI 上定位缺失翻译
/// 订阅 Marker 自身的 LocalizedString。LocalizedString 会负责首次异步读取与 Locale
/// 切换后的自动刷新Timeline 不再维护独立的 Table / Key 解析逻辑
/// </summary>
private string GetLocalizedLabel(string labelKey)
private static void BindLocalizedLabel(RuntimeMarker marker)
{
if (string.IsNullOrEmpty(labelKey))
if (marker?.definition?.label == null || marker.definition.label.IsEmpty)
{
return string.Empty;
marker?.view?.SetLabel(marker?.localizedLabel ?? string.Empty);
return;
}
return LocalizationTextService.Resolve(localizationTable, labelKey, labelKey);
marker.localizedLabelChanged = localizedText =>
{
marker.localizedLabel = string.IsNullOrEmpty(localizedText)
? marker.definition.markerId
: localizedText;
if (marker.view != null)
marker.view.SetLabel(marker.localizedLabel);
};
marker.definition.label.StringChanged += marker.localizedLabelChanged;
}
private async void OnSelectedLocaleChanged(Locale _)
private static void UnbindLocalizedLabel(RuntimeMarker marker)
{
foreach (RuntimeMarker marker in _markers)
{
if (string.IsNullOrEmpty(marker.definition.labelKey)) continue;
if (marker?.definition?.label == null || marker.localizedLabelChanged == null)
return;
string localizedLabel = await LocalizationTextService.ResolveAsync(
localizationTable,
marker.definition.labelKey,
marker.definition.labelKey);
// 异步等待结束后,防范对象在此期间被销毁。
if (marker.view != null)
{
marker.view.SetLabel(localizedLabel);
}
}
marker.definition.label.StringChanged -= marker.localizedLabelChanged;
marker.localizedLabelChanged = null;
}
/// <summary>

View File

@@ -2,6 +2,7 @@ using System.Collections.Generic;
using Ichni.Story.Dialogue;
using TMPro;
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.UI;
namespace Ichni.Story.UI
@@ -24,6 +25,21 @@ namespace Ichni.Story.UI
// 当前已实例化的状态背景对象;状态切换时销毁并替换
private GameObject _currentVisual;
// 直接持有 StoryData 的 LocalizedString并订阅其 StringChanged 回调。
// Unity Localization 会在首次订阅和语言切换时自行异步刷新文本。
private LocalizedString _titleReference;
private bool _isTitleLocalizationSubscribed;
private void OnEnable()
{
StartTitleLocalization();
}
private void OnDisable()
{
StopTitleLocalization();
}
public override void Initialize(StoryBlockDefinition def, Vector2 position, StoryBlockState blockState)
{
// 注意base.Initialize 末尾会调用 ApplyState(state),届时已生成对应背景
@@ -34,9 +50,43 @@ namespace Ichni.Story.UI
if (storyIdText != null)
storyIdText.text = def.blockId;
// 当前仍直接显示 titleKey正式内容接入时需要由 Unity Localization 解析玩家可见标题。
StopTitleLocalization();
_titleReference = def.title;
StartTitleLocalization();
}
/// <summary>
/// 订阅当前 TextBlock 的 LocalizedString。无需手写 Table / Key 读取或监听全局 Locale
/// LocalizedString 会遵循 Unity 官方生命周期异步加载,并在语言变化后触发 StringChanged。
/// </summary>
private void StartTitleLocalization()
{
if (_isTitleLocalizationSubscribed || titleText == null)
return;
if (_titleReference == null || _titleReference.IsEmpty)
{
titleText.text = blockId;
return;
}
_titleReference.StringChanged += ApplyLocalizedTitle;
_isTitleLocalizationSubscribed = true;
}
private void StopTitleLocalization()
{
if (!_isTitleLocalizationSubscribed || _titleReference == null)
return;
_titleReference.StringChanged -= ApplyLocalizedTitle;
_isTitleLocalizationSubscribed = false;
}
private void ApplyLocalizedTitle(string localizedTitle)
{
if (titleText != null)
titleText.text = def.titleKey;
titleText.text = string.IsNullOrEmpty(localizedTitle) ? blockId : localizedTitle;
}
/// <summary>

View File

@@ -1,6 +1,7 @@
using Ichni.Story.Dialogue;
using Ichni.Story.UI;
using Ichni.Localization;
using Ichni.Menu;
using System.Collections.Generic;
using UnityEngine;
using Yarn.Unity;
@@ -14,14 +15,17 @@ namespace Ichni.Story.YarnFunctions
// ── Yarn Commands ────────────────────────────────────────────────────────
/// <summary>
/// 兼容既有 Yarn 脚本:授予歌曲相关的解锁 Key并在当前对话结束后弹出提示。
/// 格式: &lt;&lt;unlock_song unlock_key&gt;&gt;
/// 授予歌曲相关的解锁 Key并在当前对话结束后弹出提示。
/// 格式: &lt;&lt;unlock_song unlock_key "song_id"&gt;&gt;
/// <para>Key 必须使用小写字母、数字和下划线,例如 <c>story_ch0_prologue_completed</c>。</para>
/// <para><c>song_id</c> 必须是 <see cref="SongItemData.songName"/> 的稳定标识,而不是显示名称或本地化文本。
/// 该参数用于解析玩家可见的歌曲名称,绝不能将技术 Unlock Key 显示给玩家。</para>
/// 新内容若不需要歌曲提示,优先使用 <see cref="GrantUnlock"/>。
/// </summary>
/// <param name="songUnlockKey">要授予的稳定解锁 Key而不是歌曲显示名称。</param>
/// <param name="songId">对应 <see cref="SongItemData.songName"/> 的稳定歌曲 ID。</param>
[YarnCommand("unlock_song")]
public static void UnlockSong(string songUnlockKey)
public static void UnlockSong(string songUnlockKey, string songId)
{
ExecuteAfterDialogueCommit(() =>
{
@@ -31,7 +35,7 @@ namespace Ichni.Story.YarnFunctions
}
if (MessageUIPage.instance != null)
MessageUIPage.instance.ShowUnlockMessage(songUnlockKey);
MessageUIPage.instance.ShowUnlockMessage(ResolveSongDisplayName(songId));
else
Debug.LogError("[StoryTreeCommands] 弹窗失败:场景中未找到 StoryMessageBoxUIPage 实例!");
@@ -57,7 +61,7 @@ namespace Ichni.Story.YarnFunctions
/// <summary>
/// 在对话结束后,弹出一个自定义 MessageBox 提示。
/// 会尝试使用 Unity Localization 进行翻译如果找不到对应条目则回退显示原文本Key
/// 文本 Key 会交给 MessageUIPage 的 FIFO 队列,并在该弹窗真正显示前才按当前 Locale 解析
/// 格式: &lt;&lt;show_message titleKey contentKey [tableName]&gt;&gt;
/// </summary>
/// <param name="titleKey">标题文本或本地化键</param>
@@ -66,13 +70,13 @@ namespace Ichni.Story.YarnFunctions
[YarnCommand("show_message")]
public static void ShowMessage(string titleKey, string contentKey, string tableName = "Message")
{
string translatedTitle = GetTranslatedText(tableName, titleKey);
string translatedContent = GetTranslatedText(tableName, contentKey);
Debug.Log($"[StoryTreeCommands] 准备在对话结束后显示自定义弹窗:标题='{translatedTitle}',内容='{translatedContent}'");
Debug.Log($"[StoryTreeCommands] 准备在对话结束后显示本地化弹窗Table='{tableName}'TitleKey='{titleKey}'ContentKey='{contentKey}'。");
ExecuteAfterDialogueCommit(() =>
{
if (MessageUIPage.instance != null)
MessageUIPage.instance.ShowCustomMessage(translatedTitle, translatedContent);
MessageUIPage.instance.ShowLocalizedMessage(
new LocalizedPopupText(tableName, titleKey),
new LocalizedPopupText(tableName, contentKey));
else
Debug.LogError("[StoryTreeCommands] 无法显示自定义弹窗:未找到 MessageUIPage 实例。");
});
@@ -128,9 +132,36 @@ namespace Ichni.Story.YarnFunctions
// ── 内部辅助 ─────────────────────────────────────────────────────────────
private static string GetTranslatedText(string tableName, string key)
/// <summary>
/// 以稳定 Song ID 查找当前项目中配置的歌曲显示名。当前阶段使用 <see cref="SongItemData.displaySongName"/>
/// 将来歌曲标题接入 Chapter Content 本地化后只需替换本函数内部的返回逻辑Yarn 与弹窗 API 无需修改。
/// </summary>
private static string ResolveSongDisplayName(string songId)
{
return LocalizationTextService.Resolve(tableName, key, key);
List<ChapterSelectionUnit> chapters = ChapterSelectionManager.instance?.chapters;
if (chapters != null)
{
foreach (ChapterSelectionUnit chapter in chapters)
{
if (chapter?.songs == null)
{
continue;
}
foreach (SongItemData song in chapter.songs)
{
if (song != null && song.songName == songId)
{
return string.IsNullOrWhiteSpace(song.displaySongName)
? song.songName
: song.displaySongName;
}
}
}
}
Debug.LogWarning($"[StoryTreeCommands] 无法为歌曲解锁提示解析 Song ID '{songId}',将显示该 ID。", ChapterSelectionManager.instance);
return songId ?? string.Empty;
}
}
}

View File

@@ -1,18 +1,21 @@
//using I2.Loc;
using UnityEngine;
namespace SLSUtilities.General
{
/// <summary>
/// 历史兼容扩展。
/// <para>
/// 项目不再通过字符串扩展读取 I2 Localization运行时动态本地化请使用
/// <c>Ichni.Localization.LocalizationTextService</c>,静态 TMP 文本请使用
/// <c>Ichni.Localization.LocalizedTMPText</c>。
/// </para>
/// </summary>
public static class StringExtension
{
/// <summary>
/// 保持旧调用点的二进制/源码兼容。当前不会执行任何本地化解析。
/// </summary>
public static string Localize(this string original)
{
/*if (LocalizationManager.TryGetTranslation(original, out string translated))
{
return translated;
}*/
return original;
}
}
}
}

View File

@@ -1,2 +1,2 @@
fileFormatVersion: 2
guid: fd4a697d946242343a065437c29f0cf2
guid: fd4a697d946242343a065437c29f0cf2

View File

@@ -1,48 +1,298 @@
using System.Collections;
using System.Collections.Generic;
using Ichni.Localization;
using Michsky.MUIP;
using TMPro;
using UnityEngine;
using UnityEngine.Localization;
namespace Ichni.UI
{
/// <summary>
/// Settings 页面使用的下拉控件。
/// <para>
/// 本地化枚举项由 <see cref="SetUpLocalized(int,string,string[])"/> 在代码中传入 String Table 名称与
/// Entry Key。控件会创建对应的 <see cref="LocalizedString"/>,并在 Michsky 生成 Item 后为每个
/// 可见文字绑定 <see cref="LocalizedTMPText"/>;切换语言时不重建列表。
/// </para>
/// <para>
/// 分辨率、语言自称等运行时文本则使用 <see cref="SetUpRuntime"/>,不会附加本地化组件。
/// </para>
/// </summary>
public class Dropdown : SettingsUIElementBase
{
public List<string> options;
// 仅保存本次初始化创建的运行时引用,不在 Inspector 中维护本地化选项列表。
private readonly List<LocalizedString> _localizedOptions = new List<LocalizedString>();
// 保留原字段以兼容已有的外部读取。静态本地化选项使用稳定的占位名称;实际显示内容由
// 动态生成 Item 上的 LocalizedTMPText 管理。
[HideInInspector] public List<string> options = new List<string>();
public CustomDropdown dropdown;
public int selectedIndex;
public string selectedOption;
public void SetUp(int initialValue, List<string> options, string title = "", bool preservePrefabTitle = false)
private bool _usesLocalizedOptions;
private bool _isValueChangeListenerRegistered;
private Coroutine _bindGeneratedItemsCoroutine;
/// <summary>
/// 使用代码提供的 String Table 与 Entry Key 初始化静态枚举选项。
/// <paramref name="entryKeys"/> 的顺序即设置枚举的索引顺序,必须保持稳定。
/// 标题和说明仍由其 TMP 对象上的 <see cref="LocalizedTMPText"/> 独立管理。
/// </summary>
public void SetUpLocalized(int initialValue, string tableCollection, params string[] entryKeys)
{
base.SetUp(title, preservePrefabTitle: preservePrefabTitle);
this.options = options;
this.dropdown.items = new List<CustomDropdown.Item>();
foreach (string option in options)
base.SetUp();
ClearLocalizedBindings();
ClearLocalizedOptionDefinitions();
_usesLocalizedOptions = true;
foreach (string entryKey in entryKeys)
{
dropdown.items.Add(new CustomDropdown.Item { itemName = option });
_localizedOptions.Add(new LocalizedString(tableCollection, entryKey));
}
dropdown.onValueChanged.AddListener(value =>
{
SetValue(value);
updateValueAction?.Invoke();
});
BuildLocalizedOptionPlaceholders();
EnsureValueChangeListener();
SetValue(initialValue);
ApplyOptionsToDropdown();
}
/// <summary>
/// 使用运行时生成的纯文本选项初始化下拉框。
/// 仅用于分辨率、语言自称等不应随当前 Locale 再次翻译的内容。
/// </summary>
public void SetUpRuntime(int initialValue, IReadOnlyList<string> runtimeOptions)
{
base.SetUp();
ClearLocalizedBindings();
ClearLocalizedOptionDefinitions();
_usesLocalizedOptions = false;
options = runtimeOptions == null ? new List<string>() : new List<string>(runtimeOptions);
EnsureValueChangeListener();
SetValue(initialValue);
ApplyOptionsToDropdown();
}
private void OnEnable()
{
if (_usesLocalizedOptions)
{
QueueGeneratedItemBinding();
}
}
private void OnDisable()
{
StopGeneratedItemBinding();
}
private void OnDestroy()
{
StopGeneratedItemBinding();
ClearLocalizedOptionDefinitions();
}
public int GetOptionIndex(string option)
{
return options.IndexOf(option);
}
/// <summary>
/// 只更新当前选择状态,不调用 <see cref="updateValueAction"/>。
/// 因此语言切换和 Dropdown 列表重建都不会重新应用玩家的设置。
/// </summary>
public void SetValue(int index)
{
selectedIndex = index;
if (options == null || options.Count == 0)
{
selectedIndex = 0;
selectedOption = string.Empty;
return;
}
selectedIndex = Mathf.Clamp(index, 0, options.Count - 1);
selectedOption = options[selectedIndex];
dropdown.selectedItemIndex = selectedIndex;
dropdown.UpdateItemLayout();
if (_usesLocalizedOptions)
{
BindSelectedLocalizedText();
}
else if (dropdown.selectedText != null)
{
dropdown.selectedText.text = selectedOption;
}
}
private void EnsureValueChangeListener()
{
if (_isValueChangeListenerRegistered)
{
return;
}
dropdown.onValueChanged.AddListener(OnDropdownValueChanged);
_isValueChangeListenerRegistered = true;
}
private void OnDropdownValueChanged(int index)
{
SetValue(index);
updateValueAction?.Invoke();
}
private void BuildLocalizedOptionPlaceholders()
{
options = new List<string>(_localizedOptions.Count);
for (int index = 0; index < _localizedOptions.Count; index++)
{
// Michsky 需要 itemName 创建 Item真正可见的内容会在创建完成后被 LocalizedTMPText 覆盖。
options.Add($"LocalizedOption_{index}");
}
}
private void ApplyOptionsToDropdown()
{
if (options == null || options.Count == 0)
{
dropdown.items = new List<CustomDropdown.Item>();
return;
}
SetValue(selectedIndex);
dropdown.items = new List<CustomDropdown.Item>(options.Count);
foreach (string option in options)
{
dropdown.items.Add(new CustomDropdown.Item { itemName = option });
}
if (dropdown.gameObject.activeInHierarchy)
{
if (dropdown.isOn)
{
dropdown.Animate();
}
dropdown.SetupDropdown();
}
else
{
dropdown.UpdateItemLayout();
}
if (_usesLocalizedOptions)
{
QueueGeneratedItemBinding();
}
}
/// <summary>
/// 等待一帧,确保 Michsky 已销毁旧 Item 并完成当前批次的实例化,再为每个 Item 绑定引用。
/// 这样不会保留已销毁 Item 的语言监听,也避免把引用绑定到上一批列表对象。
/// </summary>
private void QueueGeneratedItemBinding()
{
if (!isActiveAndEnabled || _bindGeneratedItemsCoroutine != null)
{
return;
}
_bindGeneratedItemsCoroutine = StartCoroutine(BindGeneratedItemsNextFrame());
}
private IEnumerator BindGeneratedItemsNextFrame()
{
yield return null;
_bindGeneratedItemsCoroutine = null;
BindSelectedLocalizedText();
if (dropdown.itemParent == null)
{
yield break;
}
int itemCount = Mathf.Min(dropdown.itemParent.childCount, _localizedOptions.Count);
for (int index = 0; index < itemCount; index++)
{
TMP_Text itemText = dropdown.itemParent.GetChild(index).GetComponentInChildren<TMP_Text>(true);
BindLocalizedText(itemText, _localizedOptions[index]);
}
}
private void BindSelectedLocalizedText()
{
if (!_usesLocalizedOptions || _localizedOptions.Count == 0)
{
return;
}
int optionIndex = Mathf.Clamp(selectedIndex, 0, _localizedOptions.Count - 1);
BindLocalizedText(dropdown.selectedText, _localizedOptions[optionIndex]);
}
private static void BindLocalizedText(TMP_Text text, LocalizedString reference)
{
if (text == null)
{
return;
}
LocalizedTMPText localizedText = text.GetComponent<LocalizedTMPText>();
if (localizedText == null)
{
localizedText = text.gameObject.AddComponent<LocalizedTMPText>();
}
localizedText.SetStringReference(reference);
}
/// <summary>
/// 将本 Dropdown 先前动态附加的本地化引用清空。
/// 同一控件改用运行时文本列表时必须执行此步骤,否则旧 Locale 回调会覆盖新的原始文本。
/// </summary>
private void ClearLocalizedBindings()
{
ClearLocalizedBinding(dropdown.selectedText);
if (dropdown.itemParent == null)
{
return;
}
foreach (Transform item in dropdown.itemParent)
{
ClearLocalizedBinding(item.GetComponentInChildren<TMP_Text>(true));
}
}
private static void ClearLocalizedBinding(TMP_Text text)
{
LocalizedTMPText localizedText = text == null ? null : text.GetComponent<LocalizedTMPText>();
if (localizedText != null)
{
localizedText.SetStringReference(null);
}
}
private void ClearLocalizedOptionDefinitions()
{
// LocalizedString 的订阅由每个 LocalizedTMPText 持有ClearLocalizedBindings 已经解除它们。
// 当前 Unity Localization 版本没有公开的 LocalizedString.Dispose因此清空运行时列表即可。
_localizedOptions.Clear();
}
private void StopGeneratedItemBinding()
{
if (_bindGeneratedItemsCoroutine == null)
{
return;
}
StopCoroutine(_bindGeneratedItemsCoroutine);
_bindGeneratedItemsCoroutine = null;
}
}
}

View File

@@ -17,10 +17,22 @@ namespace Ichni.UI
public TMP_Text keyText;
public GameObject waitingForInputCover;
public void SetUp(string title, string subtitle, string actionName, int bindingIndex)
private bool _isClickListenerRegistered;
/// <summary>
/// 初始化重绑定行为。标题和说明由 Prefab 上的 LocalizedTMPText 配置;
/// <paramref name="actionName"/> 仅用于定位 Input System Action不是本地化 Key。
/// </summary>
public void SetUp(string actionName, int bindingIndex)
{
base.SetUp(title, subtitle);
base.SetUp();
if (_isClickListenerRegistered)
{
return;
}
button.onClick.AddListener(() => StartRebinding(actionName, bindingIndex));
_isClickListenerRegistered = true;
}
// 开始重绑定流程
@@ -82,4 +94,4 @@ namespace Ichni.UI
}
}
}
}
}

View File

@@ -1,6 +1,3 @@
using System.Collections;
using System.Collections.Generic;
using I2.Loc;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
@@ -10,9 +7,6 @@ namespace Ichni.UI
{
public abstract class SettingsUIElementBase : MonoBehaviour
{
public string title;
public string subTitle;
public Image titleBackground;
public TMP_Text titleText;
public TMP_Text subTitleText;
@@ -21,52 +15,22 @@ namespace Ichni.UI
/// <summary>
/// 初始化设置控件的标题区域。
/// <paramref name="preservePrefabTitle"/> 用于已经由 Unity Localization 直接驱动标题的控件:
/// 运行时代码不会覆盖或隐藏 Prefab 中的本地化标题。
/// <para>
/// 标题与说明不再由此基础类写入 I2 Key。请在对应 <see cref="TMP_Text"/> 上配置
/// <c>LocalizedTMPText</c>,使静态文案与控件逻辑完全解耦。
/// </para>
/// <paramref name="preservePrefabTitle"/> 为 true 时保留 Prefab 的标题区域;这是设置页面的默认行为。
/// </summary>
public virtual void SetUp(string title = "", string subTitle = "", bool preservePrefabTitle = false)
public virtual void SetUp(bool preservePrefabTitle = true)
{
if (preservePrefabTitle)
{
return;
}
if (title != "")
{
SetTitle(title, subTitle);
}
else
{
titleBackground.gameObject.SetActive(false);
titleText.gameObject.SetActive(false);
subTitleText.gameObject.SetActive(false);
}
}
public void SetTitle(string title, string subTitle = "")
{
this.title = title;
this.subTitle = subTitle;
titleText.gameObject.SetActive(true);
var titleLoc = titleText.GetComponent<Localize>();
if (titleLoc != null)
titleLoc.SetTerm(title);
else
titleText.text = title;
if (subTitle != "")
{
subTitleText.gameObject.SetActive(true);
var subLoc = subTitleText.GetComponent<Localize>();
if (subLoc != null)
subLoc.SetTerm(subTitle);
else
subTitleText.text = subTitle;
}
else
{
subTitleText.gameObject.SetActive(false);
}
titleBackground.gameObject.SetActive(false);
titleText.gameObject.SetActive(false);
subTitleText.gameObject.SetActive(false);
}
}
}

View File

@@ -6,20 +6,27 @@ namespace Ichni.UI
{
public bool value;
public SwitchManager switchManager;
private bool _isValueChangeListenerRegistered;
public void SetUp(bool initialValue, string title = "", bool preservePrefabTitle = false)
public void SetUp(bool initialValue, bool preservePrefabTitle = true)
{
base.SetUp(title, preservePrefabTitle: preservePrefabTitle);
base.SetUp(preservePrefabTitle);
switchManager.onValueChanged.AddListener(isOn =>
if (!_isValueChangeListenerRegistered)
{
value = isOn;
updateValueAction?.Invoke();
});
switchManager.onValueChanged.AddListener(OnSwitchValueChanged);
_isValueChangeListenerRegistered = true;
}
SetValue(initialValue);
}
private void OnSwitchValueChanged(bool isOn)
{
value = isOn;
updateValueAction?.Invoke();
}
public void SetValue(bool value)
{
this.value = value;

View File

@@ -1,7 +1,3 @@
using System.Collections;
using System.Collections.Generic;
using I2.Loc;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
@@ -10,25 +6,28 @@ namespace Ichni.UI
public class TextButton : SettingsUIElementBase
{
public Button button;
public TMP_Text buttonText;
public void SetUp(string title, string subTitle, string textContent)
private bool _isClickListenerRegistered;
/// <summary>
/// 初始化按钮逻辑。标题、说明及按钮文字均由 Prefab 上的 LocalizedTMPText 配置,
/// 不再把字符串当作 I2 的 Term 传入。
/// </summary>
public void SetUp()
{
base.SetUp(title, subTitle);
var localize = buttonText.GetComponent<Localize>();
if (localize != null)
base.SetUp();
if (_isClickListenerRegistered)
{
localize.SetTerm(textContent);
}
else
{
buttonText.text = textContent;
return;
}
button.onClick.AddListener(() =>
{
updateValueAction?.Invoke();
});
button.onClick.AddListener(InvokeUpdateValueAction);
_isClickListenerRegistered = true;
}
private void InvokeUpdateValueAction()
{
updateValueAction?.Invoke();
}
}
}
}

View File

@@ -2,7 +2,6 @@ using System;
using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using I2.Loc;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
@@ -27,13 +26,13 @@ namespace Ichni.UI
public string suffix;
public bool showPositiveMark;
public void SetUp(int initialValue, int step, string title = "")
public void SetUp(int initialValue, int step)
{
intStep = step;
intMin = int.MinValue;
intMax = int.MaxValue;
base.SetUp(title);
base.SetUp();
increaseButton.SetUpButton(IncreaseValue, IncreaseValue);
decreaseButton.SetUpButton(DecreaseValue, DecreaseValue);
@@ -94,7 +93,7 @@ namespace Ichni.UI
{
valueText.text = prefix + (showPositiveMark && intValue > 0 ? "+" : "") + intValue.ToString() + suffix;
var target = new Vector2((float)(intValue - intMin) / (intMax - intMin) * 660, 20);
var target = new Vector2((float)(intValue - intMin) / (intMax - intMin) * 560, 20);
barImage.rectTransform.sizeDelta = target;
updateValueAction?.Invoke();
}
@@ -106,7 +105,7 @@ namespace Ichni.UI
if (LastValue == intValue) return;
tween?.Complete();
valueText.text = prefix + (showPositiveMark && intValue > 0 ? "+" : "") + intValue.ToString() + suffix;
var target = new Vector2((float)(intValue - intMin) / (intMax - intMin) * 660, 20);
var target = new Vector2((float)(intValue - intMin) / (intMax - intMin) * 560, 20);
tween = barImage.rectTransform.DOSizeDelta(target, 0.2f).SetEase(Ease.OutExpo).Play();
LastValue = intValue;
updateValueAction?.Invoke();
@@ -117,4 +116,4 @@ namespace Ichni.UI
return intValue;
}
}
}
}

View File

@@ -15,7 +15,7 @@ namespace Ichni.Menu
public override void Initialize()
{
mainVolumeModifier.SetUp(gameSettings.masterVolume, 10, "Menu UI/Settings_Master_Volume");
mainVolumeModifier.SetUp(gameSettings.masterVolume, 10);
mainVolumeModifier.SetMinMax(0, 100);
mainVolumeModifier.updateValueAction = () =>
{
@@ -23,7 +23,7 @@ namespace Ichni.Menu
SettingsManager.instance.ApplyAudioSettings();
};
musicVolumeModifier.SetUp(gameSettings.musicVolume, 10, "Menu UI/Settings_Music_Volume");
musicVolumeModifier.SetUp(gameSettings.musicVolume, 10);
musicVolumeModifier.SetMinMax(0, 100);
musicVolumeModifier.updateValueAction = () =>
{
@@ -31,7 +31,7 @@ namespace Ichni.Menu
SettingsManager.instance.ApplyAudioSettings();
};
sfxVolumeModifier.SetUp(gameSettings.soundEffectVolume, 10, "Menu UI/Settings_SFX_Volume");
sfxVolumeModifier.SetUp(gameSettings.soundEffectVolume, 10);
sfxVolumeModifier.SetMinMax(0, 100);
sfxVolumeModifier.updateValueAction = () =>
{
@@ -39,7 +39,7 @@ namespace Ichni.Menu
SettingsManager.instance.ApplyAudioSettings();
};
uiVolumeModifier.SetUp(gameSettings.uiVolume, 10, "Menu UI/Settings_UI_Volume");
uiVolumeModifier.SetUp(gameSettings.uiVolume, 10);
uiVolumeModifier.SetMinMax(0, 100);
uiVolumeModifier.updateValueAction = () =>
{
@@ -47,8 +47,7 @@ namespace Ichni.Menu
SettingsManager.instance.ApplyAudioSettings();
};
inGameAudioEffectsSwitch.SetUp(gameSettings.enableInGameAudioEffects,
"Menu UI/Settings_InGame_Audio_Effects");
inGameAudioEffectsSwitch.SetUp(gameSettings.enableInGameAudioEffects);
inGameAudioEffectsSwitch.updateValueAction = () =>
{
gameSettings.enableInGameAudioEffects = inGameAudioEffectsSwitch.GetValue();

View File

@@ -13,19 +13,19 @@ namespace Ichni.Menu
public override void Initialize()
{
debugModeSwitch.SetUp(gameSettings.debugMode, "Menu UI/Settings_Debug_Mode");
debugModeSwitch.SetUp(gameSettings.debugMode);
debugModeSwitch.updateValueAction = () =>
{
gameSettings.debugMode = debugModeSwitch.GetValue();
};
judgeTypeSwitch.SetUp(gameSettings.judgeType, "Menu UI/Settings_Judge_Type");
judgeTypeSwitch.SetUp(gameSettings.judgeType);
judgeTypeSwitch.updateValueAction = () =>
{
gameSettings.judgeType = judgeTypeSwitch.GetValue();
};
autoPlaySwitch.SetUp(gameSettings.autoPlay, "Menu UI/Settings_Auto_Play");
autoPlaySwitch.SetUp(gameSettings.autoPlay);
autoPlaySwitch.updateValueAction = () =>
{
gameSettings.autoPlay = autoPlaySwitch.GetValue();
@@ -39,4 +39,4 @@ namespace Ichni.Menu
autoPlaySwitch.SetValue(gameSettings.autoPlay);
}
}
}
}

View File

@@ -9,7 +9,7 @@ namespace Ichni.UI
public Dropdown languageDropdown;
public override void Initialize()
{
offsetEditorButton.SetUp("Menu UI/Settings_Offset_Editor", "", "Menu UI/Settings_Enter");
offsetEditorButton.SetUp();
offsetEditorButton.updateValueAction = () =>
{
gameObject.SetActive(false);
@@ -19,7 +19,10 @@ namespace Ichni.UI
MenuManager.instance.settingsUIPage.settingsWindowController.buttonsContainer.gameObject.SetActive(false);
};
languageDropdown.SetUp(SettingsManager.instance.GetLanguageDropdownIndex(), MenuManager.instance.displayLanguageList, "Menu UI/Settings_Language");
// 语言列表采用各语言的自称(例如日本語、한국어),不应随当前 Locale 再次翻译。
languageDropdown.SetUpRuntime(
SettingsManager.instance.GetLanguageDropdownIndex(),
MenuManager.instance.displayLanguageList);
languageDropdown.updateValueAction = () =>
{
SettingsManager.instance.SetLanguageByDropdownIndex(languageDropdown.selectedIndex);

View File

@@ -8,32 +8,34 @@ namespace Ichni.Menu
{
public class GraphicsSettingsWindow : SettingsWindow
{
private static readonly List<string> QualityPresetOptions = new List<string>
private const string UiTable = "UI";
private static readonly string[] QualityPresetKeys =
{
"Performant",
"Balanced",
"High Fidelity"
"ui_settings_quality_performance",
"ui_settings_quality_balanced",
"ui_settings_quality_high_fidelity"
};
private static readonly List<string> DisplayModeOptions = new List<string>
private static readonly string[] BloomQualityKeys =
{
"Fullscreen",
"Borderless Fullscreen",
"Windowed"
"ui_settings_bloom_off",
"ui_settings_bloom_performance",
"ui_settings_bloom_standard"
};
private static readonly List<string> BloomQualityOptions = new List<string>
private static readonly string[] VfxQualityKeys =
{
"Off",
"Performance",
"Standard"
"ui_settings_vfx_low",
"ui_settings_vfx_medium",
"ui_settings_vfx_high"
};
private static readonly List<string> VfxQualityOptions = new List<string>
private static readonly string[] DisplayModeKeys =
{
"Low",
"Medium",
"High"
"ui_settings_display_fullscreen",
"ui_settings_display_borderless_fullscreen",
"ui_settings_display_windowed"
};
private readonly List<Vector2Int> _availableDisplayResolutions = new List<Vector2Int>();
@@ -52,15 +54,14 @@ namespace Ichni.Menu
public override void Initialize()
{
qualityPresetDropdown.SetUp((int)gameSettings.graphicsQualityPreset, QualityPresetOptions,
"Menu UI/Settings_Quality_Preset");
qualityPresetDropdown.SetUpLocalized((int)gameSettings.graphicsQualityPreset, UiTable, QualityPresetKeys);
qualityPresetDropdown.updateValueAction = () =>
{
gameSettings.graphicsQualityPreset = (GraphicsQualityPreset)qualityPresetDropdown.selectedIndex;
SettingsManager.instance.ApplyGraphicSettings();
};
renderScaleModifier.SetUp(gameSettings.renderScaleLevel, 1, "Menu UI/Settings_Render_Scale");
renderScaleModifier.SetUp(gameSettings.renderScaleLevel, 1);
renderScaleModifier.SetMinMax(0, 5);
renderScaleModifier.updateValueAction = () =>
{
@@ -68,7 +69,7 @@ namespace Ichni.Menu
SettingsManager.instance.ApplyGraphicSettings();
};
targetFrameModifier.SetUp(gameSettings.targetFrame, 30, "Menu UI/Settings_Target_Frame");
targetFrameModifier.SetUp(gameSettings.targetFrame, 30);
targetFrameModifier.SetMinMax(30, 120);
targetFrameModifier.updateValueAction = () =>
{
@@ -119,21 +120,21 @@ namespace Ichni.Menu
return;
}
postProcessingSwitch.SetUp(gameSettings.enablePostProcessing, preservePrefabTitle: true);
postProcessingSwitch.SetUp(gameSettings.enablePostProcessing);
postProcessingSwitch.updateValueAction = () =>
{
gameSettings.enablePostProcessing = postProcessingSwitch.GetValue();
SettingsManager.instance.ApplyPostProcessingSettings();
};
bloomQualityDropdown.SetUp((int)gameSettings.bloomQuality, BloomQualityOptions, preservePrefabTitle: true);
bloomQualityDropdown.SetUpLocalized((int)gameSettings.bloomQuality, UiTable, BloomQualityKeys);
bloomQualityDropdown.updateValueAction = () =>
{
gameSettings.bloomQuality = (BloomQuality)bloomQualityDropdown.selectedIndex;
SettingsManager.instance.ApplyPostProcessingSettings();
};
vfxQualityDropdown.SetUp((int)gameSettings.vfxQuality, VfxQualityOptions, preservePrefabTitle: true);
vfxQualityDropdown.SetUpLocalized((int)gameSettings.vfxQuality, UiTable, VfxQualityKeys);
vfxQualityDropdown.updateValueAction = () =>
{
gameSettings.vfxQuality = (VfxQuality)vfxQualityDropdown.selectedIndex;
@@ -145,23 +146,21 @@ namespace Ichni.Menu
{
BuildDisplayResolutionOptions();
vSyncSwitch.SetUp(gameSettings.vSyncEnabled, "Menu UI/Settings_VSync");
vSyncSwitch.SetUp(gameSettings.vSyncEnabled);
vSyncSwitch.updateValueAction = () =>
{
gameSettings.vSyncEnabled = vSyncSwitch.GetValue();
SettingsManager.instance.ApplyDisplaySettings();
};
displayModeDropdown.SetUp((int)gameSettings.displayMode, DisplayModeOptions,
"Menu UI/Settings_Display_Mode");
displayModeDropdown.SetUpLocalized((int)gameSettings.displayMode, UiTable, DisplayModeKeys);
displayModeDropdown.updateValueAction = () =>
{
gameSettings.displayMode = (GraphicsDisplayMode)displayModeDropdown.selectedIndex;
SettingsManager.instance.ApplyDisplaySettings();
};
displayResolutionDropdown.SetUp(GetDisplayResolutionIndex(), _displayResolutionOptions,
"Menu UI/Settings_Display_Resolution");
displayResolutionDropdown.SetUpRuntime(GetDisplayResolutionIndex(), _displayResolutionOptions);
displayResolutionDropdown.updateValueAction = () =>
{
Vector2Int resolution = _availableDisplayResolutions[displayResolutionDropdown.selectedIndex];

View File

@@ -25,10 +25,10 @@ namespace Ichni.Menu
foreach (RebindActionData data in rebindActions["Keyboard"])
{
// 在C# 8.0+ 中,可以使用静态匿名函数来避免闭包分配
data.rebindButton.SetUp(data.title, data.subtitle, data.actionName, data.bindingIndex);
data.rebindButton.SetUp(data.actionName, data.bindingIndex);
}
resetButton.SetUp("Menu UI/Settings_ResetRebinding", "", "Menu UI/Settings_Confirm");
resetButton.SetUp();
resetButton.updateValueAction = ResetAllBindings;
}
@@ -114,9 +114,6 @@ namespace Ichni.Menu
[System.Serializable]
public class RebindActionData
{
public string title;
[FormerlySerializedAs("description")] public string subtitle;
[Tooltip("必须与Input Actions Asset中的Action名称完全匹配")]
public string actionName;
@@ -132,4 +129,4 @@ namespace Ichni.Menu
}
}
}
}

Binary file not shown.

View File

@@ -0,0 +1,65 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Contour Flow
m_Shader: {fileID: 4800000, guid: caa72d45b56d4aca8bd51d79b8d99135, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _BottomGlowPower: 8
- _BottomGlowStrength: 1
- _BreathSpeed: 4
- _ColorMask: 15
- _EchoDistance: 0.02
- _EchoStrength: 2
- _FlowScale: 4
- _FlowSpeed: 0.18
- _FlowStrength: 0.03
- _LineBoost: 0.38
- _LineSoftness: 0.14
- _LineThreshold: 0
- _PulseIntensity: 3
- _PulseSpeed: 2
- _PulseWidth: 0.02
- _RippleFrequency: 32
- _RippleRadius: 0.9
- _RippleSpeed: 0.7
- _RippleStrength: 0.003
- _Stencil: 0
- _StencilComp: 8
- _StencilOp: 0
- _StencilReadMask: 255
- _StencilWriteMask: 255
- _UseClipRect: 0
- _UseUIAlphaClip: 0
m_Colors:
- _AccentColor: {r: 0.6399999, g: 0.37999994, b: 1, a: 1}
- _BottomGlowColor: {r: 0.04, g: 0.19999996, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _LineColor: {r: 0.35999998, g: 0.58, b: 1, a: 1}
- _RippleCenter: {r: 0.38, g: 0.48, b: 0, a: 0}
m_BuildTextureStacks: []
m_AllowLocking: 1

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 3722087dd8cab124386a1b764bef2017
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,306 @@
Shader "Ichni/UI/Contour Flow"
{
Properties
{
[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
_Color ("Tint", Color) = (1, 1, 1, 1)
[Header(Organic Motion)]
_FlowScale ("Flow Scale", Range(0.5, 12)) = 4.0
_FlowSpeed ("Flow Speed", Range(-2, 2)) = 0.18
_FlowStrength ("Flow Strength", Range(0, 0.03)) = 0.004
_RippleCenter ("Ripple Center", Vector) = (0.38, 0.48, 0, 0)
_RippleRadius ("Ripple Radius", Range(0.05, 1.5)) = 0.9
_RippleFrequency ("Ripple Frequency", Range(1, 80)) = 32
_RippleSpeed ("Ripple Speed", Range(-10, 10)) = 0.7
_RippleStrength ("Ripple Strength", Range(0, 0.03)) = 0.003
[Header(Contour Energy)]
_LineColor ("Line Color", Color) = (0.36, 0.58, 1, 1)
_AccentColor ("Pulse Accent", Color) = (0.64, 0.38, 1, 1)
_LineThreshold ("Line Threshold", Range(0, 1)) = 0.17
_LineSoftness ("Line Softness", Range(0.001, 0.5)) = 0.14
_LineBoost ("Line Boost", Range(0, 2)) = 0.38
_PulseSpeed ("Pulse Speed", Range(-2, 2)) = 0.08
_PulseWidth ("Pulse Width", Range(0.02, 0.48)) = 0.14
_PulseIntensity ("Pulse Intensity", Range(0, 3)) = 0.9
_BreathSpeed ("Breath Speed", Range(0, 4)) = 0.55
_EchoDistance ("Colored Echo Distance", Range(0, 0.02)) = 0.002
_EchoStrength ("Colored Echo Strength", Range(0, 2)) = 0.22
[Header(Bottom Energy)]
_BottomGlowColor ("Bottom Glow Color", Color) = (0.04, 0.2, 1, 1)
_BottomGlowStrength ("Bottom Glow Strength", Range(0, 1)) = 0.14
_BottomGlowPower ("Bottom Glow Falloff", Range(0.5, 8)) = 3.2
[Header(UI)]
_StencilComp ("Stencil Comparison", Float) = 8
_Stencil ("Stencil ID", Float) = 0
_StencilOp ("Stencil Operation", Float) = 0
_StencilWriteMask ("Stencil Write Mask", Float) = 255
_StencilReadMask ("Stencil Read Mask", Float) = 255
_ColorMask ("Color Mask", Float) = 15
[Toggle(UNITY_UI_CLIP_RECT)] _UseClipRect ("Use UI Clip Rect", Float) = 0
[Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use UI Alpha Clip", Float) = 0
}
SubShader
{
Tags
{
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent"
"PreviewType" = "Plane"
"CanUseSpriteAtlas" = "False"
}
Stencil
{
Ref [_Stencil]
Comp [_StencilComp]
Pass [_StencilOp]
ReadMask [_StencilReadMask]
WriteMask [_StencilWriteMask]
}
Cull Off
Lighting Off
ZWrite Off
ZTest [unity_GUIZTestMode]
Blend SrcAlpha OneMinusSrcAlpha
ColorMask [_ColorMask]
Pass
{
Name "Contour Flow UI"
CGPROGRAM
#pragma target 3.0
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_local _ UNITY_UI_CLIP_RECT
#pragma multi_compile_local _ UNITY_UI_ALPHACLIP
#include "UnityCG.cginc"
#include "UnityUI.cginc"
struct appdata_t
{
float4 vertex : POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float4 texcoord : TEXCOORD0;
float4 worldPosition : TEXCOORD1;
half4 mask : TEXCOORD2;
UNITY_VERTEX_OUTPUT_STEREO
};
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _MainTex_TexelSize;
fixed4 _Color;
fixed4 _TextureSampleAdd;
float4 _ClipRect;
float _UIMaskSoftnessX;
float _UIMaskSoftnessY;
float _FlowScale;
float _FlowSpeed;
float _FlowStrength;
float4 _RippleCenter;
float _RippleRadius;
float _RippleFrequency;
float _RippleSpeed;
float _RippleStrength;
fixed4 _LineColor;
fixed4 _AccentColor;
float _LineThreshold;
float _LineSoftness;
float _LineBoost;
float _PulseSpeed;
float _PulseWidth;
float _PulseIntensity;
float _BreathSpeed;
float _EchoDistance;
float _EchoStrength;
fixed4 _BottomGlowColor;
float _BottomGlowStrength;
float _BottomGlowPower;
v2f vert(appdata_t v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.worldPosition = v.vertex;
o.vertex = UnityObjectToClipPos(o.worldPosition);
o.texcoord.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
o.texcoord.zw = v.texcoord;
o.color = v.color * _Color;
float2 pixelSize = o.vertex.w;
pixelSize /= abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
o.mask = half4(
v.vertex.xy * 2 - clampedRect.xy - clampedRect.zw,
0.25 / (0.25 * half2(_UIMaskSoftnessX, _UIMaskSoftnessY) + abs(pixelSize.xy))
);
return o;
}
half PerceivedLuminance(half3 color)
{
#ifndef UNITY_COLORSPACE_GAMMA
color = LinearToGammaSpace(color);
#endif
return dot(color, half3(0.2126, 0.7152, 0.0722));
}
float2 BuildAnimatedUV(float2 uv, out float2 flowDirection, out float flowSignal)
{
float time = _Time.y;
float aspect = max(_MainTex_TexelSize.z / max(_MainTex_TexelSize.w, 1.0), 0.001);
float2 aspectPosition = uv - 0.5;
aspectPosition.x *= aspect;
float flowTime = time * _FlowSpeed;
float flowX =
sin(aspectPosition.y * _FlowScale + flowTime) +
0.45 * sin((aspectPosition.x + aspectPosition.y) * (_FlowScale * 0.73) - flowTime * 0.61);
float flowY =
cos(aspectPosition.x * (_FlowScale * 0.89) - flowTime * 0.83) +
0.45 * sin((aspectPosition.x - aspectPosition.y) * (_FlowScale * 0.57) + flowTime * 0.47);
float2 flow = float2(flowX, flowY) / 1.45;
float2 flowUV = flow;
flowUV.x /= aspect;
float2 rippleDelta = uv - _RippleCenter.xy;
rippleDelta.x *= aspect;
float rippleDistance = max(length(rippleDelta), 0.0001);
float2 rippleDirection = rippleDelta / rippleDistance;
float rippleEnvelope = 1.0 - smoothstep(_RippleRadius * 0.2, _RippleRadius, rippleDistance);
float rippleWave = sin(rippleDistance * _RippleFrequency - time * _RippleSpeed);
float2 rippleUV = rippleDirection;
rippleUV.x /= aspect;
float2 animatedUV =
uv +
flowUV * _FlowStrength +
rippleUV * (rippleWave * rippleEnvelope * _RippleStrength);
flowDirection = normalize(flowUV + rippleUV * (rippleWave * rippleEnvelope) + float2(0.001, 0.001));
flowSignal = (flowX + flowY + rippleWave * rippleEnvelope) * 0.3333;
float2 halfTexel = _MainTex_TexelSize.xy * 0.5;
return clamp(animatedUV, halfTexel, 1.0 - halfTexel);
}
fixed4 frag(v2f i) : SV_Target
{
float2 flowDirection;
float flowSignal;
float2 animatedUV = BuildAnimatedUV(i.texcoord.xy, flowDirection, flowSignal);
half4 source = tex2D(_MainTex, animatedUV) + _TextureSampleAdd;
half sourceLuminance = PerceivedLuminance(source.rgb);
half echoDifference = 0;
UNITY_BRANCH
if (_EchoStrength > 0.0001 && _EchoDistance > 0.000001)
{
float2 halfTexel = _MainTex_TexelSize.xy * 0.5;
float2 echoUV = clamp(
animatedUV - flowDirection * _EchoDistance,
halfTexel,
1.0 - halfTexel
);
half echoLuminance = PerceivedLuminance(tex2D(_MainTex, echoUV).rgb);
echoDifference = saturate(abs(echoLuminance - sourceLuminance) * 5.0);
}
half lineMask = smoothstep(
_LineThreshold,
_LineThreshold + max(_LineSoftness, 0.001),
sourceLuminance
);
float pulsePhase = frac(
animatedUV.y * 0.78 +
animatedUV.x * 0.22 +
flowSignal * 0.035 -
_Time.y * _PulseSpeed
);
float pulseDistance = abs(pulsePhase - 0.5);
float pulseFeather = max(fwidth(pulsePhase) * 1.5, 0.006);
half pulse = 1.0 - smoothstep(
_PulseWidth,
_PulseWidth + pulseFeather,
pulseDistance
);
half breath = 0.8 + 0.2 * sin(
_Time.y * _BreathSpeed +
sourceLuminance * 12.0 +
flowSignal
);
half lineEnergy =
lineMask *
breath *
(0.35 + pulse * _PulseIntensity) *
_LineBoost;
half3 movingLineColor = lerp(
_LineColor.rgb * _LineColor.a,
_AccentColor.rgb * _AccentColor.a,
pulse
);
half echoEnergy = echoDifference * (0.35 + pulse * 0.65) * _EchoStrength;
half bottomGlow = pow(saturate(1.0 - i.texcoord.w), _BottomGlowPower);
bottomGlow *= _BottomGlowStrength *
(0.9 + 0.1 * cos(_Time.y * _BreathSpeed * 0.6));
half3 enhancedColor =
source.rgb +
movingLineColor * lineEnergy +
_AccentColor.rgb * (_AccentColor.a * echoEnergy) +
_BottomGlowColor.rgb * (_BottomGlowColor.a * bottomGlow);
fixed4 color;
color.rgb = enhancedColor * i.color.rgb;
color.a = source.a * i.color.a;
#ifdef UNITY_UI_CLIP_RECT
half2 clipMask = saturate(
(_ClipRect.zw - _ClipRect.xy - abs(i.mask.xy)) * i.mask.zw
);
color.a *= clipMask.x * clipMask.y;
#endif
#ifdef UNITY_UI_ALPHACLIP
clip(color.a - 0.001);
#endif
return color;
}
ENDCG
}
}
}

View File

@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: caa72d45b56d4aca8bd51d79b8d99135
ShaderImporter:
externalObjects: {}
defaultTextures: []
nonModifiableTextures: []
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,63 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: UI_Expanding Contours
m_Shader: {fileID: 4800000, guid: abcd49c27bc748dc98d692443877ab00, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _CenterMargin: 0
- _ColorMask: 15
- _ContourSpacing: 0.075
- _EdgeSoftness: 0.5
- _EmitterCount: 6
- _ExpansionCurve: 0.3
- _FadeDuration: 0.25
- _FusionStrength: 0.1
- _Irregularity: 0.45
- _LineWidth: 0.0005
- _MaxRadius: 0.75
- _MorphAmount: 1
- _Opacity: 0.1
- _RandomSeed: 0
- _ShapeDetail: 1
- _ShapeVariation: 1
- _SpawnRate: 0.05
- _Stencil: 0
- _StencilComp: 8
- _StencilOp: 0
- _StencilReadMask: 255
- _StencilWriteMask: 255
- _TopologyRelease: 1
- _TrailFade: 0.5
- _TrailLength: 0.5
- _UseClipRect: 0
- _UseUIAlphaClip: 0
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _LineColor: {r: 1, g: 1, b: 1, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 983ae72c51d95034eaf1e7800b0115fe
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,459 @@
Shader "Ichni/UI/Expanding Contours"
{
Properties
{
[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
_Color ("Graphic Tint", Color) = (1, 1, 1, 1)
[Header(Line)]
_LineColor ("Line Color", Color) = (1, 1, 1, 1)
_Opacity ("Opacity", Range(0, 1)) = 0.5
_LineWidth ("Line Width", Range(0.0005, 0.02)) = 0.0005
_EdgeSoftness ("Edge Softness", Range(0.5, 4)) = 0.5
_ContourSpacing ("Contour Spacing", Range(0.01, 0.2)) = 0.1
_TrailLength ("Contour Trail Length", Range(0.02, 1.5)) = 0.5
_TrailFade ("Inner Line Fade", Range(0, 1)) = 1
[Header(Emission)]
_EmitterCount ("Simultaneous Emitters", Range(1, 6)) = 4
_SpawnRate ("Event Cycles Per Second", Range(0.02, 1)) = 0.05
_MaxRadius ("Maximum Radius", Range(0.1, 2)) = 0.5
_ExpansionCurve ("Expansion Curve", Range(0.3, 3)) = 0.85
_FadeDuration ("Lifetime Fade", Range(0.01, 0.45)) = 0.16
_CenterMargin ("Random Center Margin", Range(0, 0.45)) = 0
_RandomSeed ("Random Seed", Float) = 0
[Header(Shape)]
_Irregularity ("Shape Irregularity", Range(0, 0.45)) = 0.45
_ShapeDetail ("Shape Detail", Range(0, 1)) = 1
_MorphAmount ("Shape Morph Amount", Range(0, 1)) = 1
_ShapeVariation ("Per Shape Variation", Range(0, 1)) = 1
_FusionStrength ("Intersection Fusion", Range(0, 0.2)) = 0.04
_TopologyRelease ("Topology Release", Range(0, 2)) = 1
[Header(UI)]
_StencilComp ("Stencil Comparison", Float) = 8
_Stencil ("Stencil ID", Float) = 0
_StencilOp ("Stencil Operation", Float) = 0
_StencilWriteMask ("Stencil Write Mask", Float) = 255
_StencilReadMask ("Stencil Read Mask", Float) = 255
_ColorMask ("Color Mask", Float) = 15
[Toggle(UNITY_UI_CLIP_RECT)] _UseClipRect ("Use UI Clip Rect", Float) = 0
[Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use UI Alpha Clip", Float) = 0
}
SubShader
{
Tags
{
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent"
"PreviewType" = "Plane"
"CanUseSpriteAtlas" = "True"
}
Stencil
{
Ref [_Stencil]
Comp [_StencilComp]
Pass [_StencilOp]
ReadMask [_StencilReadMask]
WriteMask [_StencilWriteMask]
}
Cull Off
Lighting Off
ZWrite Off
ZTest [unity_GUIZTestMode]
Blend SrcAlpha OneMinusSrcAlpha
ColorMask [_ColorMask]
Pass
{
Name "Expanding Contours UI"
CGPROGRAM
#pragma target 3.0
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_local _ UNITY_UI_CLIP_RECT
#pragma multi_compile_local _ UNITY_UI_ALPHACLIP
#include "UnityCG.cginc"
#include "UnityUI.cginc"
#define MAX_EMITTERS 6
struct appdata_t
{
float4 vertex : POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 uv : TEXCOORD0;
float4 worldPosition : TEXCOORD1;
half4 mask : TEXCOORD2;
UNITY_VERTEX_OUTPUT_STEREO
};
fixed4 _Color;
fixed4 _LineColor;
float _Opacity;
float _LineWidth;
float _EdgeSoftness;
float _ContourSpacing;
float _TrailLength;
float _TrailFade;
float _EmitterCount;
float _SpawnRate;
float _MaxRadius;
float _ExpansionCurve;
float _FadeDuration;
float _CenterMargin;
float _RandomSeed;
float _Irregularity;
float _ShapeDetail;
float _MorphAmount;
float _ShapeVariation;
float _FusionStrength;
float _TopologyRelease;
float4 _ClipRect;
float _UIMaskSoftnessX;
float _UIMaskSoftnessY;
v2f vert(appdata_t v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.worldPosition = v.vertex;
o.vertex = UnityObjectToClipPos(o.worldPosition);
o.uv = v.texcoord;
o.color = v.color * _Color;
float2 pixelSize = o.vertex.w;
pixelSize /= abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
o.mask = half4(
v.vertex.xy * 2 - clampedRect.xy - clampedRect.zw,
0.25 / (0.25 * half2(_UIMaskSoftnessX, _UIMaskSoftnessY) + abs(pixelSize.xy))
);
return o;
}
float Hash11(float value)
{
value = frac(value * 0.1031);
value *= value + 33.33;
value *= value + value;
return frac(value);
}
float2 Hash21(float value)
{
float3 value3 = frac(
float3(value, value, value) *
float3(0.1031, 0.1030, 0.0973)
);
value3 += dot(value3, value3.yzx + 33.33);
return frac((value3.xx + value3.yz) * value3.zy);
}
float2 GetRandomDirection(float seed)
{
float2 direction = Hash21(seed) * 2.0 - 1.0;
return direction * rsqrt(max(dot(direction, direction), 0.0001));
}
float2 NormalizeSafe(float2 direction)
{
return direction * rsqrt(max(dot(direction, direction), 0.0001));
}
float2 ComplexMultiply(float2 a, float2 b)
{
return float2(
a.x * b.x - a.y * b.y,
a.y * b.x + a.x * b.y
);
}
float GetRectAspect(float2 uv)
{
float uGradient = max(length(float2(ddx(uv.x), ddy(uv.x))), 0.000001);
float vGradient = max(length(float2(ddx(uv.y), ddy(uv.y))), 0.000001);
return clamp(vGradient / uGradient, 0.1, 10.0);
}
float GetIrregularDistance(
float2 uv,
float2 center,
float aspect,
float eventSeed,
float life
)
{
float2 delta = uv - center;
delta.x *= aspect;
float2 shapeAxis = GetRandomDirection(eventSeed + 17.23);
float2 perpendicularAxis = float2(-shapeAxis.y, shapeAxis.x);
float axisStretch = lerp(
1.0,
lerp(0.72, 1.28, Hash11(eventSeed + 21.91)),
_ShapeVariation
);
float parallelDistance = dot(delta, shapeAxis) / axisStretch;
float perpendicularDistance = dot(delta, perpendicularAxis) * axisStretch;
delta =
shapeAxis * parallelDistance +
perpendicularAxis * perpendicularDistance;
float radialDistance = max(length(delta), 0.000001);
float2 direction = delta / radialDistance;
// Complex powers provide closed angular harmonics without
// texture noise, atan2, or per-pixel trigonometry.
float2 harmonic2 = ComplexMultiply(direction, direction);
float2 harmonic3 = ComplexMultiply(harmonic2, direction);
float2 harmonic5 = ComplexMultiply(harmonic3, harmonic2);
float2 harmonic7 = ComplexMultiply(harmonic5, harmonic2);
float morph = smoothstep(0.0, 1.0, life) * _MorphAmount;
float2 phaseA = NormalizeSafe(lerp(
GetRandomDirection(eventSeed + 2.31),
GetRandomDirection(eventSeed + 102.31),
morph
));
float2 phaseB = NormalizeSafe(lerp(
GetRandomDirection(eventSeed + 7.17),
GetRandomDirection(eventSeed + 107.17),
morph
));
float2 phaseC = NormalizeSafe(lerp(
GetRandomDirection(eventSeed + 13.73),
GetRandomDirection(eventSeed + 113.73),
morph
));
float broadShape =
0.58 * dot(harmonic2, phaseA) +
0.29 * dot(harmonic3, phaseB);
float fineShape =
0.09 * dot(harmonic5, phaseB) +
0.04 * dot(harmonic7, phaseC);
float detailVariation = lerp(
1.0,
lerp(0.6, 1.4, Hash11(eventSeed + 29.37)),
_ShapeVariation
);
float irregularityVariation = lerp(
1.0,
lerp(0.65, 1.35, Hash11(eventSeed + 37.61)),
_ShapeVariation
);
float shape =
broadShape +
fineShape * _ShapeDetail * detailVariation;
return radialDistance *
(1.0 + shape * _Irregularity * irregularityVariation);
}
float2 GetEmitterField(float2 uv, float aspect, float emitterIndex, float activeEmitters)
{
float stagger = emitterIndex / activeEmitters;
float timeline = _Time.y * _SpawnRate + stagger;
float cycle = floor(timeline);
float life = frac(timeline);
// R2 low-discrepancy ordering keeps both consecutive events and
// simultaneously active centers distributed across the UI.
float sequenceIndex =
cycle * activeEmitters +
(activeEmitters - 1.0 - emitterIndex);
float eventSeed =
sequenceIndex * 17.17 +
_RandomSeed * 101.13;
float2 sequenceOffset = Hash21(_RandomSeed * 43.17 + 0.71);
float2 randomCenter = frac(
sequenceOffset +
sequenceIndex * float2(0.754877666, 0.569840296)
);
float centerRange = max(1.0 - _CenterMargin * 2.0, 0.001);
float2 center = _CenterMargin + randomCenter * centerRange;
float irregularDistance = GetIrregularDistance(
uv,
center,
aspect,
eventSeed,
life
);
float radiusVariation = lerp(
1.0,
lerp(0.85, 1.15, Hash11(eventSeed + 41.93)),
_ShapeVariation
);
float expansion = pow(saturate(life), _ExpansionCurve);
float currentRadius = _MaxRadius * radiusVariation * expansion;
float fadeDuration = max(_FadeDuration, 0.01);
half fadeIn = smoothstep(0.0, fadeDuration, life);
half fadeOut = 1.0 - smoothstep(1.0 - fadeDuration, 1.0, life);
half lifeFade = fadeIn * fadeOut;
// Alpha fading alone leaves the full SDF in the smooth union
// until the emitter is removed, which makes connected contours
// snap closed. Erode the field continuously during fade-out so
// its topology is already released before the final removal.
float retirement = 1.0 - fadeOut;
float releaseDistance =
currentRadius +
_TrailLength +
_ContourSpacing +
_FusionStrength;
float releaseOffset =
retirement *
retirement *
releaseDistance *
_TopologyRelease;
float releasedDistance =
irregularDistance -
currentRadius +
releaseOffset;
return float2(releasedDistance, lifeFade);
}
fixed4 frag(v2f i) : SV_Target
{
float aspect = GetRectAspect(i.uv);
float activeEmitters = clamp(floor(_EmitterCount + 0.5), 1.0, MAX_EMITTERS);
float unionDistance = 100000.0;
half unionFade = 0;
half hasEmitter = 0;
[unroll]
for (int emitter = 0; emitter < MAX_EMITTERS; emitter++)
{
UNITY_BRANCH
if ((float)emitter < activeEmitters)
{
float2 emitterField = GetEmitterField(
i.uv,
aspect,
(float)emitter,
activeEmitters
);
UNITY_BRANCH
if (emitterField.y > 0.001)
{
if (hasEmitter < 0.5)
{
unionDistance = emitterField.x;
unionFade = emitterField.y;
hasEmitter = 1;
}
else if (_FusionStrength > 0.00001)
{
float blend = saturate(
0.5 +
0.5 * (emitterField.x - unionDistance) /
_FusionStrength
);
unionDistance =
lerp(emitterField.x, unionDistance, blend) -
_FusionStrength * blend * (1.0 - blend);
unionFade = lerp(emitterField.y, unionFade, blend);
}
else if (emitterField.x < unionDistance)
{
unionDistance = emitterField.x;
unionFade = emitterField.y;
}
}
}
}
float contourDepth = -unionDistance;
float spacing = max(_ContourSpacing, 0.0001);
float ringCoordinate = contourDepth / spacing;
float ringDistance =
abs(frac(ringCoordinate + 0.5) - 0.5) *
spacing;
float antialiasing = max(
fwidth(unionDistance) * _EdgeSoftness,
0.00001
);
half lineAlpha = 1.0 - smoothstep(
_LineWidth,
_LineWidth + antialiasing,
ringDistance
);
half outerMask = smoothstep(
-antialiasing,
antialiasing,
contourDepth
);
half innerMask = 1.0 - smoothstep(
_TrailLength - antialiasing,
_TrailLength + antialiasing,
contourDepth
);
half trailPosition = 1.0 - saturate(
contourDepth / max(_TrailLength, 0.0001)
);
half trailOpacity = lerp(
1.0 - _TrailFade,
1.0,
trailPosition
);
half contourAlpha =
lineAlpha *
outerMask *
innerMask *
trailOpacity *
unionFade *
hasEmitter;
fixed4 color;
color.rgb = _LineColor.rgb * i.color.rgb;
color.a =
saturate(contourAlpha) *
_LineColor.a *
_Opacity *
i.color.a;
#ifdef UNITY_UI_CLIP_RECT
half2 clipMask = saturate(
(_ClipRect.zw - _ClipRect.xy - abs(i.mask.xy)) * i.mask.zw
);
color.a *= clipMask.x * clipMask.y;
#endif
#ifdef UNITY_UI_ALPHACLIP
clip(color.a - 0.001);
#endif
return color;
}
ENDCG
}
}
}

View File

@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: abcd49c27bc748dc98d692443877ab00
ShaderImporter:
externalObjects: {}
defaultTextures: []
nonModifiableTextures: []
userData:
assetBundleName:
assetBundleVariant:

Some files were not shown because too many files have changed in this diff Show More