рдпреВрдирд┐рдЯреА 3 рдбреА рдореЗрдВ рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛

рдкрд░рд┐рдЪрдп


рдирдорд╕реНрдХрд╛рд░ рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ, рдЖрдЬ рд╣рдо рдПрдХрддрд╛ 3 рдбреА рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

рдкрд░рдВрдкрд░рд╛ рд╕реЗ, рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред рддреЛ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреЗ рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрди рдХреНрдпрд╛ рд╣реИрдВред рдЦреЗрд▓ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдРрд╕реЗ рд╕рдВрд╕рд╛рдзрди рд╕рдм рдХреБрдЫ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрд╡реЗрджрди рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдВрддрд┐рдо рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдХреА рд╣рд╛рд░реНрдб рдбрд┐рд╕реНрдХ рдФрд░ рдмрд╛рд╣рд░реА рд╡реЗрдм рд╕рд░реНрд╡рд░ рджреЛрдиреЛрдВ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдРрд╕реЗ рд╕рдВрд╕рд╛рдзрди рдХрд┐рд╕реА рднреА рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдбреЗрдЯрд╛ рд╕реЗрдЯ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред рдПрдХрддрд╛ 3 рдбреА рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдмреЛрд▓рддреЗ рд╣реБрдП, рдлрд┐рд░ рд╡реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

  • рдкрд╛рда рдлрд╝рд╛рдЗрд▓
  • рдмрдирд╛рд╡рдЯ рдлрд╝рд╛рдЗрд▓
  • рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓
  • рдмрд╛рдЗрдЯ рд╕рд░рдгреА
  • AssetBundle (рдПрдХрддрд╛ 3 рдбреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣)

рдиреАрдЪреЗ, рд╣рдо рдпреВрдирд┐рдЯреА 3 рдбреА рдореЗрдВ рдореМрдЬреВрдж рдЗрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ, рд╕рд╛рде рд╣реА рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЛ рднреА рд▓рд┐рдЦреЗрдВрдЧреЗред

рдиреЛрдЯ : рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдмрд╛рдХреА рд╕реА # 7+ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ 2018.3+ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдпреВрдирд┐рдЯреА 3 рдбреА рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд░реЛрдЬрд▓рд┐рди рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдПрдХрддрд╛ 3 рдбреА рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ


2017 рдПрдХрддрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рддрдВрддреНрд░ (рд╕реНрд╡-рд╡рд░реНрдгрд┐рдд рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд░реНрд╡рд░ рдбреЗрдЯрд╛ рдФрд░ рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕реЗ рдЗрдВрдЬрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдпрд╣ рдбрдмреНрд▓реНрдпреВрдбрдмреНрд▓реНрдпреВрдбрдмреНрд▓реНрдпреВ рд╡рд░реНрдЧ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдиреЗ рд╡рд┐рднрд┐рдиреНрди http рдХрдорд╛рдВрдб (рдЧреЗрдЯ, рдкреЛрд╕реНрдЯ, рдкреБрдЯ рдЗрддреНрдпрд╛рджрд┐) рдХреЗ рд╕рдордХрд╛рд▓рд┐рдХ рдпрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк (рдХреЛрд░рдЖрдЙрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреАред рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╕реАрдзрд╛ рдерд╛ред

IEnumerator LoadFromServer(string url) { var www = new WWW(url); yield return www; Debug.Log(www.text); } 

рдЗрд╕реА рддрд░рд╣, рдЖрдк рди рдХреЗрд╡рд▓ рдкрд╛рда рдбреЗрдЯрд╛, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


рд╣рд╛рд▓рд╛рдВрдХрд┐, 2017 рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд╢реБрд░реВ, рдпреВрдирд┐рдЯреА рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕рд░реНрд╡рд░ рд╕рд┐рд╕реНрдЯрдо рд╣реИ рдЬреЛ рдпреВрдирд┐рдЯреАрд╡реЗрдмрд╕реЗрдВрд╕реНрдЯ рдХреНрд▓рд╛рд╕ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдирд╛рдо рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рдПрдХрддрд╛ 2018 рддрдХ, рдпрд╣ рдбрдмреНрд▓реНрдпреВрдбрдмреНрд▓реНрдпреВрдбрдмреНрд▓реНрдпреВ рдХреЗ рд╕рд╛рде рдореМрдЬреВрдж рдерд╛, рд▓реЗрдХрд┐рди рдбрдмреНрд▓реНрдпреВрдбрдмреНрд▓реНрдпреВрдбрдмреНрд▓реНрдпреВ рдЗрдВрдЬрди рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╣реАрдВ рд╣реБрдЖ, рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдЧреЗ рд╣рдо рдХреЗрд╡рд▓ UnityWebRequest (рдЗрд╕рдХреЗ рдмрд╛рдж UWR) рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред

рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ UWR рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЗрд╕рдХреЗ рдореВрд▓ рдореЗрдВ WWW рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдЕрдВрддрд░ рд╣реИрдВ, рдЬрд┐рди рдкрд░ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред рдиреАрдЪреЗ рд▓реЛрдбрд┐рдВрдЧ рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рдПрдХ рд╕рдорд╛рди рдЙрджрд╛рд╣рд░рдг рд╣реИред

 IEnumerator LoadFromServer(string url) { var request = new UnityWebRequest(url); yield return request.SendWebRequest(); Debug.Log(request.downloadHandler.text); request.Dispose(); } 

рдирдП рдпреВрдбрдмреНрд▓реНрдпреВрдЖрд░ рд╕рд┐рд╕реНрдЯрдо рдиреЗ рдЬреЛ рдореБрдЦреНрдп рдмрджрд▓рд╛рд╡ рдкреЗрд╢ рдХрд┐рдП рд╣реИрдВ (рдЕрдВрджрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдЕрд▓рд╛рд╡рд╛) рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпреЗ рдЕрдкрд▓реЛрдб рдЕрдкрд▓реЛрдбрд╣реИрдВрдбрд▓рд░ рдФрд░ рдбрд╛рдЙрдирд▓реЛрдбрд╣реИрдВрдбрд▓рд░ рд╣реИрдВ ред рдПрдХрддрд╛ рд╕реНрд╡рдпрдВ рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЖрдВрдХрдбрд╝реЛрдВ, рдЬреИрд╕реЗ рдХрд┐ рдСрдбрд┐рдпреЛ, рдмрдирд╛рд╡рдЯ, рд╕рдВрдкрддреНрддрд┐, рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдЖрдЗрдП рдЙрдирдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


рдЯреЗрдХреНрд╕реНрдЯ


рдкрд╛рда рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЗрд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдкрд╣рд▓реЗ рд╣реА рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХреА рдЧрдИ рд╣реИред рд╣рдо рдЗрд╕реЗ рдбрд╛рдпрд░реЗрдХреНрдЯ http рдЧреЗрдЯ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВред

 IEnumerator LoadTextFromServer(string url, Action<string> response) { var request = UnityWebRequest.Get(url); yield return request.SendWebRequest(); if (!request.isHttpError && !request.isNetworkError) { response(uwr.downloadHandler.text); } else { Debug.LogErrorFormat("error request [{0}, {1}]", url, request.error); response(null); } request.Dispose(); } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдбрд╛рдЙрдирд▓реЛрдбрд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рдПрдХ рдЧреЗрдЯреНрдЯрд░ рд╣реИ рдЬреЛ рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдХреЛ UTF8 рдПрдирдХреЛрдбреЗрдб рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рд╕реЗ рд▓реЛрдбрд┐рдВрдЧ рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧ рдПрдХ рдЬреЛрдВрд╕ рдлрд╛рдЗрд▓ (рдЯреЗрдХреНрд╕реНрдЯ рдлреЙрд░реНрдо рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рдХреНрд░рдорд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡) рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИред рдЖрдк рдПрдХрддрд╛ JsonUtility рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 var data = JsonUtility.FromJson<T>(value); // T  ,    . 

рдСрдбрд┐рдпреЛ


рдСрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ UnityWebRequestMultimedia.GetAudioClip рдЕрдиреБрд░реЛрдз рдмрдирд╛рдиреЗ рдХреА рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпреВрдирд┐рдЯреА рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ DownloadHandler -udioClip рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдЕрдиреБрд░реЛрдз рдмрдирд╛рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдСрдбрд┐рдпреЛ рдЯрд╛рдЗрдк рд╕рдВрд▓рдпрди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд рдСрдбрд┐рдпреЛ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдкреНрд░рд╛рд░реВрдк (wav, aiff, oggvorbis, рдЖрджрд┐) рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

 IEnumerator LoadAudioFromServer(string url, AudioType audioType, Action<AudioClip> response) { var request = UnityWebRequestMultimedia.GetAudioClip(url, audioType); yield return request.SendWebRequest(); if (!request.isHttpError && !request.isNetworkError) { response(DownloadHandlerAudioClip.GetContent(request)); } else { Debug.LogErrorFormat("error request [{0}, {1}]", url, request.error); response(null); } request.Dispose(); } 

рдмрдирд╛рд╡рдЯ


рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдбрд╛рдЙрдирд▓реЛрдбрд┐рдВрдЧ рдмрдирд╛рд╡рдЯ рд╕рдорд╛рди рд╣реИред рдЕрдиреБрд░реЛрдз UnityWebRequestTexture.GetTexture рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдПрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, DownloadHandlerTexture рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 IEnumerator LoadTextureFromServer(string url, Action<Texture2D> response) { var request = UnityWebRequestTexture.GetTexture(url); yield return request.SendWebRequest(); if (!request.isHttpError && !request.isNetworkError) { response(DownloadHandlerTexture.GetContent(request)); } else { Debug.LogErrorFormat("error request [{0}, {1}]", url, request.error); response(null); } request.Dispose(); } 

рдПрд╕реЗрдЯ рдмрдВрдбрд▓


рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдмрдВрдбрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХрддрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╡рд╛рд▓рд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣реЗ рдЦреЗрд▓ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпреЗ рд╕рдВрд╕рд╛рдзрди рджреГрд╢реНрдп рд╕рд╣рд┐рдд рдХрд┐рд╕реА рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрдкрддреНрддрд┐ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдкрд╡рд╛рдж рд╕реА # рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ, рд╡реЗ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред AssetBundle рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреНрд╡реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ UnityWebRequestAssetBundle.GetAssetBundle рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдИ рдЧрдИ рд╣реИ ред DownloadHandlerAssetBundle рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 IEnumerator LoadBundleFromServer(string url, Action<AssetBundle> response) { var request = UnityWebRequestAssetBundle.GetAssetBundle(url); yield return request.SendWebRequest(); if (!request.isHttpError && !request.isNetworkError) { response(DownloadHandlerAssetBundle.GetContent(request)); } else { Debug.LogErrorFormat("error request [{0}, {1}]", url, request.error); response(null); } request.Dispose(); } 

рд╡реЗрдм рд╕рд░реНрд╡рд░ рдФрд░ рдмрд╛рд╣рд░реА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ рдФрд░ рд╕рдорд╛рдзрд╛рди


рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЗ рд╕рд░рд▓ рддрд░реАрдХреЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЪреАрдЬреЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИрдВред рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред

рдкрд░реНрдпрд╛рдкреНрдд рдЦрд╛рд▓реА рдЬрдЧрд╣ рдирд╣реАрдВ


рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдореБрдХреНрдд рд╕реНрдерд╛рди рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рдХрдореА рд╣реИред рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЧреЗрдо рдХреЗ рд▓рд┐рдП рдкреБрд░рд╛рдиреЗ рдЙрдкрдХрд░рдгреЛрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЖрдХрд╛рд░ рднреА рдХрд╛рдлреА рдмрдбрд╝рд╛ (рд╣реИрд▓реЛ рдкреАрд╕реА) рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдерд╛рди рдФрд░ рдХрд┐рддрдирд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ? рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдЬреЛ рдЖрдкрдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд╣ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ рд╣реИ, рдпрд╣ рдпреВрдирд┐рдЯреАрд╡реЗрдмрд░реНрд╕рдкреЗрд╕реНрдЯ.рд╣реЗрдб () рдЕрдиреБрд░реЛрдз рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдиреАрдЪреЗ рдЖрдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИред

 IEnumerator GetConntentLength(string url, Action<int> response) { var request = UnityWebRequest.Head(url); yield return request.SendWebRequest(); if (!request.isHttpError && !request.isNetworkError) { var contentLength = request.GetResponseHeader("Content-Length"); if (int.TryParse(contentLength, out int returnValue)) { response(returnValue); } else { response(-1); } } else { Debug.LogErrorFormat("error request [{0}, {1}]", url, request.error); response(-1); } } 

рдпрд╣рд╛рдВ рдПрдХ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, рд╕рд░реНрд╡рд░ рдХреЛ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ (рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреНрд░рдЧрддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП), рдЧрд▓рдд рдорд╛рди рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред

рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХрд╛ рдЖрдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реЗ рдореБрдХреНрдд рдбрд┐рд╕реНрдХ рд╕реНрдерд╛рди рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрд╕реЗрдЯ рд╕реНрдЯреЛрд░ рд╕реЗ рдореБрдлреНрдд рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

рдиреЛрдЯ : рдЖрдк рдХреИрд╢ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпреВрдирд┐рдЯреА 3 рдбреА рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдореБрдлреНрдд рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХреИрд╢ рд╕реНрдерд╛рди рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рдпреЗ рдбреЗрдЯрд╛ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИрдВред рдЙрдирдХреА рдЧрдгрдирд╛ рдХреИрд╢ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреА рдЬрд╛рддреА рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ 4GB рд╣реИред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдХреИрд╢ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдЦрд╛рд▓реА рд╕реНрдерд╛рди рд╣реИ, рддреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдорд╛рди рдЙрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдорд▓реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЧрд▓рдд рд╣реИрдВред

рдЗрдВрдЯрд░рдиреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд╛рдБрдЪ


рдмрд╣реБрдд рдмрд╛рд░, рд╕рд░реНрд╡рд░ рд╕реЗ рдХреБрдЫ рднреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕реЗрд╕ рдХреА рдХрдореА рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ: рдПрдХ рдкрддреЗ рдХреЛ рдкрд┐рдВрдЧ рдХрд░рдиреЗ рд╕реЗ рд▓реЗрдХрд░ google.ru рдкрд░ GET рдХреЗ рдЕрдиреБрд░реЛрдз рддрдХред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рдмрд╕реЗ рд╕рд╣реА рдФрд░ рддреЗрдЬрд╝ рдФрд░ рд╕реНрдерд┐рд░ рдкрд░рд┐рдгрд╛рдо рдЖрдкрдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ (рд╡рд╣реА рдЬрд╣рд╛рдБ рд╕реЗ рдлрд╝рд╛рдЗрд▓реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЬрд╛рдПрдБрдЧреА) рдПрдХ рдЫреЛрдЯреА рдлрд╝рд╛рдЗрд▓ред рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ рдпрд╣ рдКрдкрд░ рдкрд╛рда рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред
рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕реЗрд╕ рд╣реЛрдиреЗ рдХреЗ рддрдереНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ (рдореЛрдмрд╛рдЗрд▓ рдпрд╛ рд╡рд╛рдИрдлрд╛рдИ) рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдореЛрдмрд╛рдЗрд▓ рдЯреНрд░реИрдлрд╝рд┐рдХ рдкрд░ рдХрдИ рд╕реМ рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛ред рдпрд╣ Application.internetReachability рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рдЬрд░рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреИрд╢рд┐рдВрдЧ


рдЕрдЧрд▓рд╛, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдХреИрд╢рд┐рдВрдЧ рд╣реИред рдпрд╣ рдХреИрд╢рд┐рдВрдЧ рдХрд┐рд╕ рд▓рд┐рдП рд╣реИ?

  1. рдЯреНрд░реИрдлрд╝рд┐рдХ рд╕рд╣реЗрдЬреЗрдВ (рдкрд╣рд▓реЗ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рди рдХрд░реЗрдВ)
  2. рдЗрдВрдЯрд░рдиреЗрдЯ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд╛рдо рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ (рдЖрдк рдХреИрд╢ рд╕реЗ рдбреЗрдЯрд╛ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред

рдХреИрд╢реНрдб рд╣реЛрдиреЗ рдХреА рдХреНрдпрд╛ рдЬрд░реВрд░рдд рд╣реИ? рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рд╕рдм рдХреБрдЫ рд╣реИ, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдлрд╛рдЗрд▓реЗрдВ рдХреИрд╢ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдиреАрдЪреЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдФрд░ рд╕рд░рд▓ рдкрд╛рда рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХрддрд╛ рдореЗрдВ рдкрд╛рда рдХреЛ рдХреИрд╢рд┐рдВрдЧ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдмрдирд╛рд╡рдЯ рдФрд░ рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд░рд▓рддрдо рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреИрд╢ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░, рдЗрдВрдЯрд░рдиреЗрдЯ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЗрд╕рд╕реЗ рд▓реЗрддреЗ рд╣реИрдВред рдереЛрдбрд╝реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ (рдореИрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ), рд╣рдо рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреЗ рд╣реИрдВ, рдЬреЛ рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдЬрд╕рди рджреЗрддрд╛ рд╣реИред рдЖрдк рдлрд╝рд╛рдЗрд▓ рд╡рд░реНрдЧ рдХреЗ C # рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рдЕрдкрдиреА рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╕реНрд╡реАрдХреГрдд рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╢ рд╕реЗ рдлрд╛рдЗрд▓реЗрдВ рд▓рд┐рдЦ рдФрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

 private void CacheText(string fileName, string data) { var cacheFilePath = Path.Combine("CachePath", "{0}.text".Fmt(fileName)); File.WriteAllText(cacheFilePath, data); } private void CacheTexture(string fileName, byte[] data) { var cacheFilePath = Path.Combine("CachePath", "{0}.texture".Fmt(fileName)); File.WriteAllBytes(cacheFilePath, data); } 

рдЗрд╕реА рддрд░рд╣, рдХреИрд╢ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред

 private string GetTextFromCache(string fileName) { var cacheFilePath = Path.Combine(Utils.Path.Cache, "{0}.text".Fmt(fileName)); if (File.Exists(cacheFilePath)) { return File.ReadAllText(cacheFilePath); } return null; } private Texture2D GetTextureFromCache(string fileName) { var cacheFilePath = Path.Combine(Utils.Path.Cache, "{0}.texture".Fmt(fileName)); Texture2D texture = null; if (File.Exists(cacheFilePath)) { var data = File.ReadAllBytes(cacheFilePath); texture = new Texture2D(1, 1); texture.LoadImage(data, true); } return texture; } 

рдиреЛрдЯ : рдПрдХ рд╣реА UWR рдлреЙрд░реНрдо рдлрд╛рдЗрд▓ рдХреЗ url рдХреЗ рд╕рд╛рде: // рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрдирд╛рд╡рдЯ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдлрд┐рд▓рд╣рд╛рд▓, рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рдлрд╝рд╛рдЗрд▓ рдмрд╕ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдвреВрдВрдврдирд╛ рдкрдбрд╝рд╛ред

рдиреЛрдЯ : рдореИрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдСрдбрд┐рдпреЛрдХреНрд▓рд┐рдк рдХреЗ рд╕реАрдзреЗ рд▓реЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рдПрд╕реЗрдЯрдмрдВрдбрд▓ рдореЗрдВ рдРрд╕реЗ рд╕рднреА рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реВрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдСрдбрд┐рдпреЛрдХреНрд▓рд┐рдк рдХреНрд▓рд╛рд╕ рдЧреЗрдЯрдбрд╛рдЯрд╛ рдФрд░ рд╕реЗрдЯрдбрд╛рдЯрд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрд╕рд┐рдЯрдмрдВрдбрд▓ рдХреЗ рд▓рд┐рдП рдПрдХрддрд╛ рдХреЗ рд╕рд░рд▓ рд╕рдВрд╕рд╛рдзрди, рдПрдХрддрд╛ рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреИрд╢рд┐рдВрдЧ рддрдВрддреНрд░ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдЕрд╕рд▓ рдореЗрдВ, рдпрд╣ рддрдВрддреНрд░ рджреЛ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

  1. рд╕реАрдЖрд░рд╕реА рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
  2. рд╣реИрд╢ рд╡реИрд▓реНрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рд╣реИрд╢ рд╕рдмрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╕рд┐рд╕реНрдЯрдо рд╣реИ рдФрд░ рдпрд╣ рди рдХреЗрд╡рд▓ AssetBundle рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ , рдмрд▓реНрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рднреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдХреНрд╕рд░ рдмрдВрдбрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ; рджреБрдХрд╛рдиреЛрдВ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ред

рддреЛ, рдХреИрд╢рд┐рдВрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  1. рд╣рдо рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рдПрдХ рдмрдВрдбрд▓ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣ рдлрд╝рд╛рдЗрд▓ рддрдм рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ рдЬрдм рдЗрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╣реИрд╢, crc, size, рдЖрджрд┐)ред рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмрдВрдбрд▓ рдкреНрд▓рд╕ .manifest рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рдорд╛рди рдирд╛рдо рд╣реИред
  2. рдкреНрд░рдХрдЯ рд╕реЗ hash128 рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
  3. рд╣рдо рд╕рд░реНрд╡рд░ рд╕реЗ рдПрдХ рдПрд╕реЗрдЯрдмрдВрдбрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдпреВрдЖрд░рдПрд▓ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рд╛рдкреНрдд рд╣реИрд╢128 рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ

рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓рд┐рдП рдХреЛрдб:
 IEnumerator LoadAssetBundleFromServerWithCache(string url, Action<AssetBundle> response) { // ,    while (!Caching.ready) { yield return null; } //     var request = UnityWebRequest.Get(url + ".manifest"); yield return request.SendWebRequest(); if (!request.isHttpError && !request.isNetworkError) { Hash128 hash = default; // hash var hashRow = request.downloadHandler.text.ToString().Split("\n".ToCharArray())[5]; hash = Hash128.Parse(hashRow.Split(':')[1].Trim()); if (hash.isValid == true) { request.Dispose(); request = UnityWebRequestAssetBundle.GetAssetBundle(url, hash, 0); yield return request.SendWebRequest(); if (!request.isHttpError && !request.isNetworkError) { response(DownloadHandlerAssetBundle.GetContent(request)); } else { response(null); } } else { response(null); } } else { response(null); } request.Dispose(); } 


рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рд░реНрд╡рд░ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░, рдПрдХрддрд╛, рдкрд╣рд▓реЗ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреА рд╣реИ рдХрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИрд╢128 рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХреИрд╢ рдореЗрдВ рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдпрджрд┐ рдпрд╣ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛; рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЕрджреНрдпрддрди рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЬрд╛рдПрдЧреАред рдПрдХрддрд╛ рдореЗрдВ рд╕рднреА рдХреИрд╢ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреИрд╢рд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХреИрд╢ рдореЗрдВ рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рд╣реИ, рд╕рднреА рдХреИрд╢реНрдб рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рд╕рд╛рде рд╣реА рдЕрдирд╛рд╡рд╢реНрдпрдХ рд▓реЛрдЧреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ, рдпрд╛ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВред

рдиреЛрдЯ : рд╣реИрд╢ рд╡реИрд▓реНрдпреВ рдкрд╛рдиреЗ рдХрд╛ рдЗрддрдирд╛ рдЕрдЬреАрдм рддрд░реАрдХрд╛ рдХреНрдпреЛрдВ? рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рд╡рд░реНрдгрд┐рдд рддрд░реАрдХреЗ рд╕реЗ hash128 рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реЗ рдмрдВрдбрд▓ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИрд╢ рдорд╛рдиреЛрдВ рд╕реЗ AssetBundleManifest рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ ред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдкреВрд░реНрдг рдПрд╕реЗрдЯрдмрдВрдбрд▓ рд╕реНрд╡рд┐рдВрдЧ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдХреЗрд╡рд▓ рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕рдореЗрдВ рд╕реЗ рд╣реИрд╢128 рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдмрдВрдбрд▓ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдФрд░ рд╣реИрд╢128 рдорд╛рди рдХреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдВрдкрд╛рджрдХ рдореЛрдб рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


рдЕрдВрддрд┐рдо рд╕рдорд╕реНрдпрд╛, рдпрд╛ рдмрд▓реНрдХрд┐ рдбрд┐рдмрдЧрд┐рдВрдЧ рдФрд░ рд╡рд┐рдХрд╛рд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдореБрджреНрджрд╛, рд╕рдВрдкрд╛рджрдХ рдореЛрдб рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЕрдЧрд░ рдирд┐рдпрдорд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдмрдВрдбрд▓ рдХреЗ рд╕рд╛рде рдЪреАрдЬреЗрдВ рдЗрддрдиреА рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИрдВред рдмреЗрд╢рдХ, рдЖрдк рд╣рд░ рдмрд╛рд░ рдЙрдирдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХрддрд╛ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдпрд╣ рд╡рд┐рд╡рд░рдг "рдмреИрд╕рд╛рдЦреА" рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрд╕реЗрдЯрдбрд╛рдЯрдмреЗрд╕ рд╡рд░реНрдЧ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛ред

рдмрдВрдбрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдПрдХрдЬреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд░рдг рдмрдирд╛рдпрд╛:

 public class AssetBundleWrapper { private readonly AssetBundle _assetBundle; public AssetBundleWrapper(AssetBundle assetBundle) { _assetBundle = assetBundle; } } 

рдЕрдм рд╣рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рдЬреЛрдбрд╝рдиреЗ рд╣реЛрдВрдЧреЗ, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рд╣реИрдВ рдпрд╛ рдирд┐рд░реНрдорд╛рдг рдореЗрдВред рдмрд┐рд▓реНрдб рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрд╕реЗрдЯрдмрдВрдбрд▓ рдХреНрд▓рд╛рд╕ рдХреЗ рдлрдВрдХреНрд╢рдиреНрд╕ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдПрдбрд┐рдЯрд░ рдХреЗ рд▓рд┐рдП рд╣рдо рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рдПрд╕реЗрдЯрдбрд╛рдЯрдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
 public class AssetBundleWrapper { #if UNITY_EDITOR private readonly List<string> _assets; public AssetBundleWrapper(string url) { var uri = new Uri(url); var bundleName = Path.GetFileNameWithoutExtension(uri.LocalPath); _assets = new List<string>(AssetDatabase.GetAssetPathsFromAssetBundle(bundleName)); } public T LoadAsset<T>(string name) where T : UnityEngine.Object { var assetPath = _assets.Find(item => { var assetName = Path.GetFileNameWithoutExtension(item); return string.CompareOrdinal(name, assetName) == 0; }); if (!string.IsNullOrEmpty(assetPath)) { return AssetDatabase.LoadAssetAtPath<T>(assetPath); } else { return default; } } public T[] LoadAssets<T>() where T : UnityEngine.Object { var returnedValues = new List<T>(); foreach(var assetPath in _assets) { returnedValues.Add(AssetDatabase.LoadAssetAtPath<T>(assetPath)); } return returnedValues.ToArray(); } public void LoadAssetAsync<T>(string name, Action<T> result) where T : UnityEngine.Object { result(LoadAsset<T>(name)); } public void LoadAssetsAsync<T>(Action<T[]> result) where T : UnityEngine.Object { result(LoadAssets<T>()); } public string[] GetAllScenePaths() { return _assets.ToArray(); } public void Unload(bool includeAllLoadedAssets = false) { _assets.Clear(); } #else private readonly AssetBundle _assetBundle; public AssetBundleWrapper(AssetBundle assetBundle) { _assetBundle = assetBundle; } public T LoadAsset<T>(string name) where T : UnityEngine.Object { return _assetBundle.LoadAsset<T>(name); } public T[] LoadAssets<T>() where T : UnityEngine.Object { return _assetBundle.LoadAllAssets<T>(); } public void LoadAssetAsync<T>(string name, Action<T> result) where T : UnityEngine.Object { var request = _assetBundle.LoadAssetAsync<T>(name); TaskManager.Task.Create(request) .Subscribe(() => { result(request.asset as T); Unload(false); }) .Start(); } public void LoadAssetsAsync<T>(Action<T[]> result) where T : UnityEngine.Object { var request = _assetBundle.LoadAllAssetsAsync<T>(); TaskManager.Task.Create(request) .Subscribe(() => { var assets = new T[request.allAssets.Length]; for (var i = 0; i < request.allAssets.Length; i++) { assets[i] = request.allAssets[i] as T; } result(assets); Unload(false); }) .Start(); } public string[] GetAllScenePaths() { return _assetBundle.GetAllScenePaths(); } public void Unload(bool includeAllLoadedAssets = false) { _assetBundle.Unload(includeAllLoadedAssets); } #endif } 


рдиреЛрдЯ : рдХреЛрдб рдЯрд╛рд╕реНрдХрдореИрдирдЧрд░ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рд╣рдордиреЗ рдХреНрдпрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреИрд╢ рдореЗрдВ рдХреНрдпрд╛ рд╣реИред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЖрдк рдЙрд╕реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдкрд╛рда рдФрд░ рдЕрдиреНрдп рдлрд╛рдЗрд▓реЗрдВ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ):

 #if UNITY_EDITOR var path = Path.Combine(Directory.GetParent(Application.dataPath).FullName, "_EditorCache"); #else var path = Path.Combine(Application.persistentDataPath, "_AppCache"); #endif Caching.currentCacheForWriting = Caching.AddCache(path); 

рд╣рдо рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдкреНрд░рдмрдВрдзрдХ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдпрд╛ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ


рдКрдкрд░ рд╣рдордиреЗ рдПрдХрддрд╛ рдореЗрдВ рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдореБрдЦреНрдп рдкрд╣рд▓реБрдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА, рдЕрдм рдореИрдВ рдПрдкреАрдЖрдИ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬреЛ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдкрд╣рд▓реЗ, рдЪрд▓реЛ рдиреЗрдЯрд╡рд░реНрдХ рдХреНрд╡реЗрд░реА рдореИрдиреЗрдЬрд░ рдкрд░ рд░рд╣рддреЗ рд╣реИрдВред

рдзреНрдпрд╛рди рджреЗрдВ : рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЯрд╛рд╕реНрдХрдореИрди рдХреНрд▓рд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрд░рд╛рдЙрдЯрд┐рди рдкрд░ рд░реИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдПрдХ рдЕрдиреНрдп рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рдЖрд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ ред

рдЪрд▓реЛ рдЗрд╕реА рд╡рд░реНрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

 public class Network { public enum NetworkTypeEnum { None, Mobile, WiFi } public static NetworkTypeEnum NetworkType; private readonly TaskManager _taskManager = new TaskManager(); } 

NetworkType рд╕реНрдереИрддрд┐рдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЗрдВрдЯрд░рдиреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдореВрд▓реНрдп рдХрд╣реАрдВ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдиреЗрдЯрд╡рд░реНрдХ рд╡рд░реНрдЧ рдореЗрдВ рдЬрдЧрд╣ рд╣реИред

рд╕рд░реНрд╡рд░ рд╕реЗ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХрд╛ рдореВрд▓ рдХрд╛рд░реНрдп рдЬреЛрдбрд╝реЗрдВ:
 private IEnumerator WebRequest(UnityWebRequest request, Action<float> progress, Action<UnityWebRequest> response) { while (!Caching.ready) { yield return null; } if (progress != null) { request.SendWebRequest(); _currentRequests.Add(request); while (!request.isDone) { progress(request.downloadProgress); yield return null; } progress(1f); } else { yield return request.SendWebRequest(); } response(request); if (_currentRequests.Contains(request)) { _currentRequests.Remove(request); } request.Dispose(); } 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдмрджрд▓ рдЧрдИ рд╣реИред рдпрд╣ рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рдХреА рдкреНрд░рдЧрддрд┐ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рднреЗрдЬреЗ рдЧрдП рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдПрдХ рд╕реВрдЪреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд░рджреНрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

AssetBundle рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ-рдЖрдзрд╛рд░рд┐рдд рдХреНрд╡реЗрд░реА рдирд┐рд░реНрдорд╛рдг рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВ:
 private IEnumerator WebRequestBundle(string url, Hash128 hash, Action<float> progress, Action<UnityWebRequest> response) { var request = UnityWebRequestAssetBundle.GetAssetBundle(url, hash, 0); return WebRequest(request, progress, response); } 


рдЗрд╕реА рддрд░рд╣, рдмрдирд╛рд╡рдЯ, рдСрдбрд┐рдпреЛ, рдкрд╛рда, рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЕрдм рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдкреЛрд╕реНрдЯ рдХрдорд╛рдВрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рднреЗрдЬрддрд╛ рд╣реИред рдЕрдХреНрд╕рд░ рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдХреБрдЫ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдХ рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЙрдкрдпреБрдХреНрдд рдХрд╛рд░реНрдп рдЬреЛрдбрд╝реЗрдВред

рдХреБрдВрдЬреА-рдореВрд▓реНрдп рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рднреЗрдЬрдирд╛:
 private IEnumerator WebRequestPost(string url, Dictionary<string, string> formFields, Action<float> progress, Action<UnityWebRequest> response) { var request = UnityWebRequest.Post(url, formFields); return WebRequest(request, progress, response); } 


рдбреЗрдЯрд╛ рдХреЛ json рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрдирд╛:
 private IEnumerator WebRequestPost(string url, string data, Action<float> progress, Action<UnityWebRequest> response) { var request = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST) { uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(data)), downloadHandler = new DownloadHandlerBuffer() }; request.uploadHandler.contentType = "application/json"; return WebRequest(request, progress, response); } 


рдЕрдм рд╣рдо рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ AssetBundle рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░реЗрдВрдЧреЗ
 public void Request(string url, Hash128 hash, Action<float> progress, Action<AssetBundle> response, TaskManager.TaskPriorityEnum priority = TaskManager.TaskPriorityEnum.Default) { _taskManager.AddTask(WebRequestBundle(url, hash, progress, (uwr) => { if (!uwr.isHttpError && !uwr.isNetworkError) { response(DownloadHandlerAssetBundle.GetContent(uwr)); } else { Debug.LogWarningFormat("[Netowrk]: error request [{0}]", uwr.error); response(null); } }), priority); } 


рдЗрд╕реА рддрд░рд╣, рдмрдирд╛рд╡рдЯ, рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓, рдкрд╛рда рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╕рднреА рдмрдирд╛рдП рдЧрдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдлрд╛рдИ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
 public void Request(string url, Action<int> response, TaskManager.TaskPriorityEnum priority = TaskManager.TaskPriorityEnum.Default) { var request = UnityWebRequest.Head(url); _taskManager.AddTask(WebRequest(request, null, uwr => { var contentLength = uwr.GetResponseHeader("Content-Length"); if (int.TryParse(contentLength, out int returnValue)) { response(returnValue); } else { response(-1); } }), priority); } public void Clear() { _taskManager.Clear(); foreach (var request in _currentRequests) { request.Abort(); request.Dispose(); } _currentRequests.Clear(); } 


рдЗрд╕ рдкрд░, рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдкреНрд░рдмрдВрдзрдХ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЧреЗрдо рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдо рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдмрдВрдзрдХ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ


рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд░реНрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрд╛рд╣рд░реА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдмрдВрдзрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рди рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдЧрд╛, рдмрд▓реНрдХрд┐ рд▓реЛрдбрд┐рдВрдЧ, рдкреВрд░реНрдгрддрд╛, рдкреНрд░рдЧрддрд┐, рдЦрд╛рд▓реА рд╕реНрдерд╛рди рдХреА рдХрдореА, рдФрд░ рдХреИрд╢рд┐рдВрдЧ рдореБрджреНрджреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░реЗрдЧрд╛ред

рд╣рдо рдЗрд╕реА рд╡рд░реНрдЧ рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реИ
 public class ExternalResourceManager { public enum ResourceEnumType { Text, Texture, AssetBundle } private readonly Network _network = new Network(); public void ExternalResourceManager() { #if UNITY_EDITOR var path = Path.Combine(Directory.GetParent(Application.dataPath).FullName, "_EditorCache"); #else var path = Path.Combine(Application.persistentDataPath, "_AppCache"); #endif if (!System.IO.Directory.Exists(path)) { System.IO.Directory.CreateDirectory(path); #if UNITY_IOS UnityEngine.iOS.Device.SetNoBackupFlag(path); #endif } Caching.currentCacheForWriting = Caching.AddCache(path); } } 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдбрд┐рдЬрд╛рдЗрдирд░ рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдордиреЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреНрд▓рд╛рд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдЬреА рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдерд╛ред

рдЕрдм рд╣рдо рдХреИрд╢ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рд╕рд╛рде рд╣реА рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦрд╛рд▓реА рд╕реНрдерд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдФрд░ рдиреАрдЪреЗ, рдХреЛрдб AssetBundle рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдмрд╛рдХреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣реЗрд▓реНрдкрд░ рдлрдВрдХреНрд╢рди рдХреЛрдб
 public void ClearAssetBundleCache(string url) { var fileName = GetFileNameFromUrl(url); Caching.ClearAllCachedVersions(fileName); } public void ClearAllRequest() { _network.Clear(); } public void AssetBundleIsCached(string url, Action<bool> result) { var manifestFileUrl = "{0}.manifest".Fmt(url); _network.Request(manifestFileUrl, null, (string manifest) => { var hash = string.IsNullOrEmpty(manifest) ? default : GetHashFromManifest(manifest); result(Caching.IsVersionCached(url, hash)); } , TaskManager.TaskPriorityEnum.RunOutQueue); } public void CheckFreeSpace(string url, Action<bool, float> result) { GetSize(url, lengthInMb => { #if UNITY_EDITOR_WIN var logicalDrive = Path.GetPathRoot(Utils.Path.Cache); var availableSpace = SimpleDiskUtils.DiskUtils.CheckAvailableSpace(logicalDrive); #elif UNITY_EDITOR_OSX var availableSpace = SimpleDiskUtils.DiskUtils.CheckAvailableSpace(); #elif UNITY_IOS var availableSpace = SimpleDiskUtils.DiskUtils.CheckAvailableSpace(); #elif UNITY_ANDROID var availableSpace = SimpleDiskUtils.DiskUtils.CheckAvailableSpace(true); #endif result(availableSpace > lengthInMb, lengthInMb); }); } public void GetSize(string url, Action<float> result) { _network.Request(url, length => result(length / 1048576f)); } private string GetFileNameFromUrl(string url) { var uri = new Uri(url); var fileName = Path.GetFileNameWithoutExtension(uri.LocalPath); return fileName; } private Hash128 GetHashFromManifest(string manifest) { var hashRow = manifest.Split("\n".ToCharArray())[5]; var hash = Hash128.Parse(hashRow.Split(':')[1].Trim()); return hash; } 


рдЕрдм AssetBundle рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВред
 public void GetAssetBundle(string url, Action start, Action<float> progress, Action stop, Action<AssetBundleWrapper> result, TaskManager.TaskPriorityEnum taskPriority = TaskManager.TaskPriorityEnum.Default) { #if DONT_USE_SERVER_IN_EDITOR start?.Invoke(); result(new AssetBundleWrapper(url)); stop?.Invoke(); #else void loadAssetBundle(Hash128 bundleHash) { start?.Invoke(); _network.Request(url, bundleHash, progress, (AssetBundle value) => { if(value != null) { _externalResourcesStorage.SetCachedHash(url, bundleHash); } result(new AssetBundleWrapper(value)); stop?.Invoke(); }, taskPriority); }; var manifestFileUrl = "{0}.manifest".Fmt(url); _network.Request(manifestFileUrl, null, (string manifest) => { var hash = string.IsNullOrEmpty(manifest) ? default : GetHashFromManifest(manifest); if (!hash.isValid || hash == default) { hash = _externalResourcesStorage.GetCachedHash(url); if (!hash.isValid || hash == default) { result(new AssetBundleWrapper(null)); } else { loadAssetBundle(hash); } } else { if (Caching.IsVersionCached(url, hash)) { loadAssetBundle(hash); } else { CheckFreeSpace(url, (spaceAvailable, length) => { if (spaceAvailable) { loadAssetBundle(hash); } else { result(new AssetBundleWrapper(null)); NotEnoughDiskSpace.Call(); } }); } } #endif } 


рддреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:

  • Precompilation рдирд┐рд░реНрджреЗрд╢ DONT_USE_SERVER_IN_EDITOR рд╕рд░реНрд╡рд░ рд╕реЗ рдмрдВрдбрд▓реЛрдВ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдмрдВрдбрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрдЯ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдХрджрдо рд╣реИ
  • - , , - ( _externalResourcesStorage ) , , ( , ), , null
  • , Caching , , ( )
  • , , , , - ( ). , ( )

рдиреЛрдЯ : рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣реИрд╢ рдорд╛рди рдЕрд▓рдЧ рд╕реЗ рдХреНрдпреЛрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрдм рдХреЛрдИ рдЗрдВрдЯрд░рдиреЗрдЯ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдХрдиреЗрдХреНрд╢рди рдЕрд╕реНрдерд┐рд░ рд╣реИ, рдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдиреЗрдЯрд╡рд░реНрдХ рддреНрд░реБрдЯрд┐ рдереА рдФрд░ рд╣рдо рд╕рд░реНрд╡рд░ рд╕реЗ рдмрдВрдбрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдХреИрд╢ рд╕реЗ рдмрдВрдбрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВ рдпрджрд┐ рдпрд╣ рд╡рд╣рд╛рдВ рдореМрдЬреВрдж рд╣реИ ред

рдЗрд╕реА рддрд░рд╣, рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдореЗрдВ, рдкреНрд░рдмрдВрдзрдХ рдореЗрдВ, рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ: GetJson, GetTexture, GetText, GetAudio, рдЖрджрд┐ред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╕рдВрд╕рд╛рдзрди рд╕реЗрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреА рдпрджрд┐ рд╣рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рдХреБрдЫ рдбрд╛рдЙрдирд▓реЛрдб рдпрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
 public void GetPack(Dictionary<string, ResourceEnumType> urls, Action start, Action<float> progress, Action stop, Action<string, object, bool> result) { var commonProgress = (float)urls.Count; var currentProgress = 0f; var completeCounter = 0; void progressHandler(float value) { currentProgress += value; progress?.Invoke(currentProgress / commonProgress); }; void completeHandler() { completeCounter++; if (completeCounter == urls.Count) { stop?.Invoke(); } }; start?.Invoke(); foreach (var url in urls.Keys) { var resourceType = urls[url]; switch (resourceType) { case ResourceEnumType.Text: { GetText(url, null, progressHandler, completeHandler, (value, isCached) => { result(url, value, isCached); }); } break; case ResourceEnumType.Texture: { GetTexture(url, null, progressHandler, completeHandler, (value, isCached) => { result(url, value, isCached); }); } break; case ResourceEnumType.AssetBundle: { GetAssetBundle(url, null, progressHandler, completeHandler, (value) => { result(url, value, false); }); } break; } } } 


рдпрд╣рд╛рдВ рдпрд╣ рдЯрд╛рд╕реНрдХрдореИрдирдЧрд░ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ , рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдкреНрд░рдмрдВрдзрдХ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдмрд╛рд░реА-рдмрд╛рд░реА рд╕реЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдбрд╛рдЙрдирд▓реЛрдб рддрджрдиреБрд╕рд╛рд░ рд╣реЛрдЧрд╛ред

рдиреЛрдЯ : рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреЙрд░рдЯреАрди рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ , рд╕рдм рдХреБрдЫ рдЖрд╕рд╛рдиреА рд╕реЗ async / рдЗрдВрддрдЬрд╛рд░ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ)ред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдЧреЗрдорд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдпрдерд╛рд╕рдВрднрд╡ рдХреЙрдореНрдкреИрдХреНрдЯ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдФрд░ рдХреЛрдб рдЙрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рдореЗрд░реА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╕рд░рд▓ рдЧреЗрдореЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕рд░реНрд╡рд░ (MMO рдФрд░ рдЕрдиреНрдп рдЬрдЯрд┐рд▓ f2p рдЧреЗрдореНрд╕) рдХреЗ рд╕рд╛рде рдХреЛрдИ рдирд┐рд░рдВрддрд░ рд╕рдВрдЪрд╛рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддрд╛ рд╣реИ рдпрджрд┐ рд╣рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╛рдордЧреНрд░реА, рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ, рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд╕рддреНрдпрд╛рдкрди рдХреЛ рдЦрд░реАрджрдиреЗ рдФрд░ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдПрдХ рдмрд╛рд░ рдпрд╛ рдирд╣реАрдВ рднреА рдЕрдХреНрд╕рд░ рдЖрд╡реЗрджрди рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред

рд▓реЗрдЦ рдореЗрдВ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ :
рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐
рднрдВрдбрд╛рд░ редunity.com / packages/ tools / simple- disk- utils- 59382 habr.com/post/352296
habr.com/post/282524

Source: https://habr.com/ru/post/hi433366/


All Articles