Live update - kuimoani/defold GitHub Wiki
κ²μμ λ²λ€(bundle)λ‘ λ§λ€ λ, Defoldλ λͺ¨λ κ²μ 리μμ€λ€ νλ«νΌ λ³ ν¨ν€μ§λ‘ λ¬Άμ΅λλ€. λλΆλΆμ κ²½μ°μλ μμ§ μ€ν νμ μ¦μ λͺ¨λ 리μμ€μ μ κ·Όν΄μ μ€ν 리μ§λ‘λΆν° μ μνκ² λ‘λνλ κ²μ μ νΈν©λλ€. νμ§λ§ 리μμ€ λ‘λ©μ λμ€μΌλ‘ 미루λ κ²μ μν κ²½μ°λ μμ΅λλ€. μλ₯Ό λ€μ΄,
-
λΉμ μ κ²μμ μνΌμλ μ리μ¦λ₯Ό νΉμ§μΌλ‘ κ°μ§κ³ μμΌλ©°, μ μ κ° κ²μμ λλ¨Έμ§ λΆλΆμ κ³μ ν μ§λ₯Ό κ²°μ νκΈ° μ΄μ μ νλ μ΄μ΄κ° νλ μ΄ ν μ μλ 첫 λ²μ§Έ νλ§ ν¬ν¨λμ΄ μκΈ°λ₯Ό μνλ€.
-
λΉμ μ κ²μμ HTML5λ₯Ό νκ²μΌλ‘ νκ³ μλ€. μ€ν 리μ§μμ μ΄ν리μΌμ΄μ μ λ‘λ©νλ€λ κ²μ λΈλΌμ°μ μμ μ 체 μ΄ν리μΌμ΄μ ν¨ν€μ§λ₯Ό λ€μ΄λ‘λ ν΄μΌ νλ€λκ²μ λ»νλ€. μ΄λ¬ν νλ«νΌμμλ κ²μ 리μμ€μ λλ¨Έμ§λ₯Ό λ€μ΄λ‘λ νκΈ° μ μ μ΅μνμ μμ ν¨ν€μ§λ₯Ό 보λ΄μ μ±μ λΉ λ₯΄κ² μ€ννλ κ²μ΄ λμμ§λ λͺ¨λ₯Έλ€.
-
λΉμ μ κ²μμλ κ²μμ νμλ λκΉμ§ λ€μ΄λ‘λλ₯Ό μ°κΈ°νλ €λ μμ£Ό ν° λ¦¬μμ€λ€(μ΄λ―Έμ§, λμμ λ±)μ΄ ν¬ν¨λμ΄ μλ€. μ΄κ²μ μΈμ€ν¨ μ¬μ΄μ¦λ₯Ό μ€μ΄κΈ° μν¨μ΄λ€.
λΌμ΄λΈ μ λ°μ΄νΈ κΈ°λ₯μ λΉλμμ λ²λ€μμ μλμ μΌλ‘ μ μΈν 리μμ€λ€μ λ°νμμ μ΄ν리μΌμ΄μ λ²λ€λ‘ 리μμ€λ₯Ό λΆλ¬μ μ μ₯νκ² ν΄μ£Όλ λ©μ»€λμ¦μ΄λ©°, μ΄λ₯Ό μ¬μ©νμ¬ μ»¬λ μ νλ‘μμ 컨μ μ νμ₯ν©λλ€.
μ°λ¦¬κ° ν° κ³ ν΄μλ μ΄λ―Έμ§ 리μμ€λ€μ ν¬ν¨ν κ²μμ λ§λ€κ³ μλ€κ³ κ°μ ν΄ λ΄ μλ€. μ΄ κ²μμ μ΄ μ΄λ―Έμ§λ€μ μ€νλΌμ΄νΈ κ²μ μ€λΈμ νΈμ λ£μ΄ 컬λ μ μμ μ μ§ μν€λ €κ³ ν©λλ€.
μ΄λ¬ν 컬λ μ μ λμ μΌλ‘ λ‘λνλ €λ©΄, κ°λ¨νκ²λ 컬λ μ νλ‘μ μ»΄ν¬λνΈλ₯Ό μΆκ°νκ³ "monalisa.collection"λ₯Ό μ§μ νλ©΄ λ©λλ€. μ΄μ κ²μμ "load" λ©μΈμ§λ₯Ό 컬λ μ νλ‘μλ‘ λ³΄λ΄μ μ€ν 리μ§μμ λ©λͺ¨λ¦¬λ‘ 컬λ μ μ μλ 컨ν μΈ λ₯Ό μΈμ λ‘λν μ§ μ νν μ μμ΅λλ€. νμ§λ§ μ°λ¦¬λ ν λ° λ λμκ°μ 컬λ μ μ ν¬ν¨λ 리μμ€μ λ‘λ©μ μ μ΄νλ €κ³ ν©λλ€.
μ΄ μμ μ 컬λ μ νλ‘μ νλ‘νΌν°μ Exclude 체ν¬λ°μ€λ₯Ό 체ν¬νλ©΄, μ΄ν리μΌμ΄μ λ²λ€μ μμ±ν λ λ²λ€λ¬(bundler)μκ² "monalisa.collection"μ λͺ¨λ 컨ν μΈ λ₯Ό λ¨κ²¨ λ¬λΌκ³ λ§ν΄ μ€μΌλ‘μ¨ μνλ©λλ€.
λ²λ€λ¬κ° μ΄ν리μΌμ΄μ λ²λ€μ μμ±ν λ, μ μΈ λ 리μμ€λ₯Ό μ΄λκ°μλ μ μ₯ν΄μΌ ν©λλ€. λΌμ΄λΈ μ λ°μ΄νΈλ₯Ό μν νλ‘μ νΈ μ ν μ μ΄λ€ 리μμ€λ€μ μμΉλ₯Ό λ€λ£Ήλλ€. μ΄ μ ν μ Project βΈ Live update Settingsβ¦ μμ μ°Ύμ μ μμ΅λλ€.
μ¬κΈ°μ Defoldκ° μ€μ μ μ μ₯ν μ μλ λ κ°μ§ λ°©λ²μ΄ μμ΅λλ€. λΌμ΄λΈ μ λ°μ΄νΈ μ ν μ°½μμ Mode λλ‘λ€μ΄ λ²νΌμ μ΄μ΄ μ μ₯ λ°©μμ μ νν΄ λ³΄μΈμ.
μ΄ μ΅μ μ Defoldμκ² μλ§μ‘΄ μΉ μλΉμ€(AWS) S3 λ²μΌμ μ μΈλ 리μμ€λ₯Ό μλμΌλ‘ μ λ‘λ νλΌκ³ μ§μν©λλ€. AWS Credential profile μ μ΄λ¦μ μ λ ₯νκ³ μ λΉν Bucketκ³Ό Prefix λ₯Ό μ ννμΈμ. AWS κ³μ μ μ μ νλ μμΈν λ°©λ²μ μλμμ νμΈν΄ μ£ΌμΈμ.
μ΄ μ΅μ μ Defoldμκ² μ μΈλ 리μμ€λ₯Ό ν¬ν¨ν Zip μμΆ νμΌμ μμ±νλΌκ³ μ§μν©λλ€. μ΄ μμΆ νμΌμ Export pathμ μ€μ ν κ²½λ‘μ μ μ₯λ©λλ€.
λ²λ€λ§(bundling)μμ μ μΈλ 컬λ μ νλ‘μλ μΌλ°μ μΈ μ»¬λ μ νλ‘μ μ²λΌ λμν©λλ€. νλμ μ€μν μ°¨μ΄μ μΌλ‘λ λ²λ€ μ€ν 리μ§μμ μ¬μ©ν μ μλ 리μμ€κ° μλ€λ©΄, "load" λ©μΈμ§λ₯Ό μ μ‘νλ κ²μ΄ μ€ν¨νκ² λλ€λ κ²μ λλ€.
κ·Έλ¬λ―λ‘ "load" λ©μΈμ§λ₯Ό 보λ΄κΈ° μ μ, λλ½λ 리μμ€κ° μλμ§ νμΈν΄μΌ νλ©°, λλ½λ 리μμ€κ° μλ€λ©΄ λ€μ΄λ‘λ ν μ μ₯νλ©΄ λ©λλ€. λ€μμ 리μμ€κ° μλ§μ‘΄ S3μ "my-resources"λΌλ prefixμ "my-game-bucket" λΌλ bucketμΌλ‘ μ μ₯λμ΄ μλ€κ³ κ°μ ν μμ μ½λμ λλ€.
function init(self)
self.resources_pending = 0 [1]
msg.post("#", "attempt_load_resources")
end
-- μ΄ ν¨μλ 컬λ μ
νλ‘μλ₯Ό λ‘λνλλ° νμν λ€μ΄λ‘λλ 리μμ€λ₯Ό μ μ₯νλ € ν λλ§λ€ νΈμΆ λ©λλ€.
local function resource_store_response(self, hexdigest, status)
if status == true then
-- 리μμ€λ₯Ό μ±κ³΅μ μΌλ‘ λ‘λν¨
print("Resource data stored: " .. hexdigest)
-- λ€μ 리μμ€λ₯Ό μν΄ νλ λΉΌκΈ°...
self.resources_pending = self.resources_pending - 1
-- μ λΆ μ±κ³΅μ μΌλ‘ μ μ₯λ¨, μ΄μ νλ‘μ 컬λ μ
μ λ‘λν λκ° λ¨
if self.resources_pending == 0 then
msg.post("#proxy", "load") [8]
end
else
-- ERROR! λ°μ΄ν° μ μ₯ μ€ν¨!
print("Failed to store resource data: " .. hexdigest)
end
end
function on_message(self, message_id, message, sender)
if message_id == hash("attempt_load_resources") then
local missing_resources = collectionproxy.missing_resources("#proxy") [2]
-- μμ§ μλνμ§ μμ λλ½λ 리μμ€λ₯Ό μν΄ λ€μ΄λ‘λ μμ²μ κ°μν¨
for _,resource_hash in ipairs(missing_resources) do
msg.post("#", "attempt_download", { resource_hash = resource_hash})
end
self.resources_pending = #missing_resources [3]
-- λ§μ½ μλν°μμμ μ€ννλκ±°λ©΄ λͺ¨λ 리μμ€κ° μ΄λ―Έ λ‘λλκ±°λ‘ λ¨
if self.resources_pending == 0 then
msg.post("#proxy", "load")
end
elseif message_id == hash("attempt_download") then
local manifest = resource.get_current_manifest() [4]
local base_url = "https://my-game-bucket.s3.amazonaws.com/my-resources/" [5]
http.request(base_url .. message.resource_hash, "GET", function(self, id, response)
if response.status == 200 or response.status == 304 then [6]
-- okλ‘ μλ΅(response) λ°μ
print("storing " .. message.resource_hash)
resource.store_resource(manifest, response.response, message.resource_hash, resource_store_response) [7]
else
-- ERROR! 리μμ€ λ€μ΄λ‘λ μ€ν¨!
print("Failed to download resource: " .. message.resource_hash)
end
end)
elseif message_id == hash("proxy_loaded") then
msg.post(sender, "init")
msg.post(sender, "enable")
end
end- [1] νλ‘μ 컬λ μ μ λ‘λνκΈ° μ μ μΌλ§λ λ§μ 리μμ€λ₯Ό λ€μ΄λ‘λ νκ³ μ μ₯ν΄μΌ νλμ§ μλ €μ£Όλ κ°λ¨ν μΉ΄μ΄ν°. μ΄ μ½λλ μλ¬λ₯Ό μ ν μ²λ¦¬νμ§ μκ³ μμΌλ―λ‘ μ€μ μ νμ© μ½λμμλ λ€μ΄λ‘λμ μ μ₯ μμ μ λ λ§μ μ²λ¦¬κ° νμν¨.
- [2] λ€μ΄λ‘λμ μ μ₯μ΄ νμν λͺ¨λ 리μμ€λ€μ νλν¨
- [3] λλ½λ 리μμ€λ€μ μλ₯Ό μ μ₯ν΄μ μΉ΄μ΄νΈ λ€μ΄ ν¨
- [4] λ²λ€μ λͺ¨λ 리μμ€λ€μ λμ΄νκ³ μ¬μ©κ°λ₯ μ¬λΆλ₯Ό νμΈν μ΄νμ νμ¬ λ©λνμ€νΈκ° νμν¨
- [5] 리μμ€λ₯Ό μλ§μ‘΄ S3 μ μ μ₯ν¨. λ§μ½ Zip νμΌλ‘ μ μ₯νλ€λ©΄, νμΌμ μ΄λκ°μ νΈμ€ν νκ³ http.request()λ‘ λ€μ΄λ‘λ ν λ νμΌμ μμΉλ₯Ό μ°Έμ‘°ν΄μΌ ν¨
- [6]. νμΌμ΄ ν¬λμ¬ λλ©΄ μλ§μ‘΄μ΄ 304 statusλ₯Ό 리ν΄ν¨
- [7]. λ°μ΄ν°λ₯Ό λ€κ³ μμΌλ―λ‘ μ μ₯μ μλν¨
- [8]. μ€ν 리μ§μ μ±κ³΅μ μΌλ‘ μ μ₯νμΌλ©΄ 리μμ€ μΉ΄μ΄ν°κ° 0μ΄ λ¨. μ΄μ 컬λ μ νλ‘μμ "load" λ©μΈμ§λ₯Ό 보λ΄λ μμ ν¨. νΉμ μ§μ μμ λ€μ΄λ‘λλ μ μ₯μ΄ μ€ν¨ν κ²½μ°μ 리μμ€ μΉ΄μ΄ν°κ° 0μ΄ λ μ μμ
μμ λ‘λ© μ½λλ₯Ό μ¬μ©ν΄μ μ΄ν리μΌμ΄μ μ ν μ€νΈ ν μ μμ΅λλ€. νμ§λ§ μλν°μμμ μ€ννλ©΄ μ무κ²λ λ€μ΄λ‘λ νμ§ μμ΅λλ€. μλνλ©΄ λΌμ΄λΈ μ λ°μ΄νΈλ λ²λ€(bundle)μ κΈ°λ₯μ΄κΈ° λλ¬Έμ λλ€. μλν° νκ²½μμ μ€ννλ©΄ μ΄λ€ 리μμ€λ μ μΈ(exclude)λμ§ μμ΅λλ€. μ΄ λμμ΄ μ λμκ°λμ§ νμΈνλ €λ©΄, λ²λ€λ‘ λ§λ€μ΄μ μ€νν΄μΌ ν©λλ€.
λΌμ΄λΈ μ λ°μ΄νΈλ₯Ό μ΄μ©ν΄ λ²λ€μ λ§λλ κ²μ μ½μ΅λλ€. Project βΈ Bundle λ©λ΄λ₯Ό μ ννκ³ μ΄ν리μΌμ΄μ λ²λ€μ λ§λ€κΈ° μνλ νλ«νΌμ μ ννλ©΄ λ²λ€λ§ λ€μ΄μΌλ‘κ·Έ μ°½μ΄ μ΄λ¦½λλ€.
λ²λ€λ§(dundling) ν λ, μ μΈ λ¦¬μμ€(excluded resource)λ€μ μ΄ν리μΌμ΄μ λ²λ€μμ μ μΈλ©λλ€. Publish Live update content 체ν¬λ°μ€λ₯Ό 체ν¬νλ©΄ λΌμ΄λΈ μ λ°μ΄νΈλ₯Ό μ΄λ»κ² μ ν νλμ§(μ λ΄μ© μ°Έκ³ )μ λ°λΌ μλ§μ‘΄μ μ¬λ¦΄μ§ Zip νμΌμ μμ±ν μ§λ₯Ό Defoldμκ² μλ €μ€λλ€.
Packageλ₯Ό ν΄λ¦νκ³ μ΄ν리μΌμ΄μ λ²λ€μ΄ λ§λ€μ΄μ§ μμΉλ₯Ό μ νν©λλ€. μ΄μ μ΄ν리μΌμ΄μ μ μμν΄μ λͺ¨λ μμλλ‘ λμνλμ§ νμΈν μ μμ΅λλ€.
μλ§μ‘΄ μλΉμ€μ Defold λΌμ΄λΈ μ λ°μ΄νΈ κΈ°λ₯μ ν¨κ» μ¬μ©νκΈ° μν΄μλ μλ§μ‘΄ μΉ μλΉμ€ κ³μ μ΄ νμν©λλ€. μμ§ κ³μ μ΄ μ€λΉλμ§ μμλ€λ©΄ https://aws.amazon.com/ μμ μμ±ν μ μμ΅λλ€.
μ΄ μΉμ μμλ μλ§μ‘΄ μΉ μλΉμ€μμ μ νλ μ‘μΈμ€ κΆνμΌλ‘ μ μ μ λ₯Ό μμ±νλ λ°©λ²μ μ€λͺ νκ³ , κ²μ ν΄λΌμ΄μΈνΈκ° μλ§μ‘΄ S3μ 리μμ€λ₯Ό νμ ν μ μλλ‘ μ€μ νλ λ°©λ²λ ν¨κ» μ€λͺ ν©λλ€. μλ§μ‘΄ S3 λ₯Ό μ€μ νλ μμΈν μ 보λ Amazon S3 λ¬Έμλ₯Ό μ°Έκ³ λ°λλλ€.
Services λ©λ΄λ₯Ό μ΄κ³ Storage μΉ΄ν κ³ λ¦¬(Amazon S3 Console)μ μλ S3λ₯Ό μ νν©λλ€. κΈ°μ‘΄ λ²μΌ(bucket)λ€κ³Ό μ λ²μΌμ λ§λλ μ΅μ μ λ³Ό μ μμ΅λλ€. κΈ°μ‘΄ λ²μΌμ μ¬μ©ν μλ μμ§λ§, μ‘μΈμ€ μμμ μ½κ² μ νν μ μλλ‘ λΌμ΄λΈ μ λ°μ΄νΈ 리μμ€(Live update resources)λ₯Ό μν μ λ²μΌμ λ§λ€κΈ° μΆμ²ν©λλ€.
μ¬μ©νλ €λ λ²μΌμ μ ννκ³ Properties ν¨λμ μ΄μ΄ ν¨λμμ Permissions μ΅μ μ νμ₯νμΈμ. Add bucket policy λ²νΌμ ν΄λ¦ν΄μ λ²μΌ μ μ± μ μ΄μ΄λ³΄μΈμ. μ΄ μνμ λ²μΌ μ μ± μ μ무 μ μ λ λ²μΌμ νμΌλ€μ νμν μ μκ² ν΄μ£Όκ³ , κ²μ ν΄λΌμ΄μΈνΈκ° λΌμ΄λΈ μ λ°μ΄νΈ 리μμ€λ₯Ό λ€μ΄λ‘λ ν μ μκ² ν΄μ€λλ€. λ²μΌ μ μ± μ λν μΆκ°μ 보λ₯Ό λ³΄κ³ μΆλ€λ©΄, Amazon λ¬Έμλ₯Ό μ°Έκ³ νμΈμ.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::defold-liveupdate-example/*"
}
]
}Cross-Origin Resource Sharing (CORS)λ JavsScriptλ₯Ό μ¬μ©νμ¬ μΉμ¬μ΄νΈμμ μλ‘ λ€λ₯Έ λλ©μΈμ 리μμ€λ₯Ό νμνκ² ν΄ μ£Όλ λ©μ»€λμ¦μ λλ€. λ§μ½ λΉμ μ κ²μμ HTML5λ‘ λ°°ν¬νλ € νλ€λ©΄, CORS μ€μ μ λΉμ μ λ²μΌμ μΆκ°ν΄μΌ ν©λλ€.
μ¬μ©νλ €λ λ²μΌμ μ ννκ³ Properties ν¨λμ μ΄μ΄ ν¨λμμ Permissions μ΅μ μ νμ₯νμΈμ. Add CORS Configuration λ²νΌμ ν΄λ¦ν΄μ λ²μΌ μ μ± μ μ΄μ΄λ³΄μΈμ. μλ μνμ Configuration μ μμΌλμΉ΄λ(*) λλ©μΈμ μ§μ ν΄μ μ΄λ€ μΉμ¬μ΄νΈμμλ μ‘μΈμ€λκ² ν μ μμ§λ§, κ²μμ μ€νν μΉμ¬μ΄νΈμ λλ©μΈμ μκ³ μλ€λ©΄ μ‘μΈμ€λ₯Ό μ ννλ κ²λ κ°λ₯ν©λλ€. Amazon CORS configuration μ λν λ λ§μ μ 보λ₯Ό μκ³ μΆλ€λ©΄ Amazon λ¬Έμλ₯Ό μ°Έκ³ λ°λλλ€.
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
</CORSRule>
</CORSConfiguration>Services λ©λ΄λ₯Ό μ΄κ³ Security, Identity & Compliance μΉ΄ν κ³ λ¦¬(Amazon IAM Console)μ μλ IAMλ₯Ό μ νν©λλ€. μΌμͺ½μ μλ λ©λ΄μμ Policiesλ₯Ό μ ννλ©΄ κΈ°μ‘΄ μ μ± λ€κ³Ό μ μ μ± μ λ§λλ μ΅μ μ λ³Ό μ μμ΅λλ€.
Create Policy λ²νΌμ ν΄λ¦νκ³ Create Your Own Policy λ₯Ό μ ννμΈμ. μλ μμ μ μ μ± μ μ μ κ° Defold νλ‘μ νΈμ λΌμ΄λΈ μ λ°μ΄νΈμ μ€μ νλ λͺ¨λ λ²μΌλ€μ λͺ©λ‘μ λ³Ό μ μκ² ν΄μ€λλ€. λν Access Control List (ACL)μ νλνμ¬ λΌμ΄λΈ μ λ°μ΄νΈ 리μμ€μ μ§μ λ λ²μΌμ 리μμ€λ₯Ό μ λ‘λ ν μ μκ² ν΄μ€λλ€. Amazon Identity κ·Έλ¦¬κ³ Access Management (IAM) μ λ μμΈν μ 보λ₯Ό μκ³ μΆλ€λ©΄ Amazon λ¬Έμλ₯Ό μ°Έκ³ λ°λλλ€.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": [
"s3:GetBucketAcl"
],
"Resource": "arn:aws:s3:::defold-liveupdate-example"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::defold-liveupdate-example/*"
}
]
}Services λ©λ΄λ₯Ό μ΄κ³ Security, Identity & Compliance μΉ΄ν κ³ λ¦¬(Amazon IAM Console)μ μλ IAMλ₯Ό μ νν©λλ€. μΌμͺ½μ μλ λ©λ΄μμ Users λ₯Ό μ ννλ©΄ κΈ°μ‘΄ μ μ λ€κ³Ό μ μ μ λ₯Ό λ§λλ μ΅μ μ λ³Ό μ μμ΅λλ€. κΈ°μ‘΄ μ μ λ₯Ό μ¬μ©νλ κ²λ μ’μ§λ§, μ‘μΈμ€ μμμ μ½κ² μ νν μ μλλ‘ λΌμ΄λΈ μ λ°μ΄νΈ 리μμ€(Live update resources)λ₯Ό μν μ μ μ λ₯Ό λ§λ€κΈ° μΆμ²ν©λλ€.
Add User λ²νΌμ ν΄λ¦νκ³ usernameμ μ 곡νκ³ Access type μΌλ‘ Programmatic access λ₯Ό μ νν©λλ€. κ·Έλ¦¬κ³ Next: Permissions λ₯Ό λλ¬μ Attach existing policies directlyλ₯Ό μ ννκ³ μμ 4. μμ λ§λ€μλ μ μ± μ μ νν©λλ€.
μ΄ μμ μ μλ €νλ©΄ Access key ID μ Secret access key κ° μ 곡λ©λλ€.
μ΄ νμ΄μ§μμ λκ° μ΄νμλ λ€μ μλ§μ‘΄μμ μ΄ ν€λ₯Ό μ‘°ν ν μ μμΌλ―λ‘, μ΄λ€ ν€λ₯Ό μ μ₯ν΄ λλ κ²μ΄ λ§€μ° μ€μν©λλ€.
μ΄μ κΉμ§λ λ²μΌμ λ§λ€κ³ , λ²μΌ μ μ± μ ꡬμ±νκ³ , CORS μ€μ μ μΆκ°νκ³ , μ μ μ λ₯Ό μμ±νκ³ , μ μ μ μ± μ μμ± νμ΅λλ€. μ΄μ λ¨μ ν κ°μ§λ Defold μλν°κ° μ¬μ©μλ₯Ό λμ ν΄ λ²μΌμ μ‘μΈμ€ ν μ μλλ‘ credentials profile νμΌμ μμ±νλ κ²μ λλ€.
λΉμ μ home ν΄λμ ".aws" λΌλ μ λλ ν 리λ₯Ό μμ±νκ³ , κ·Έ ν΄λμ "credentials" νμΌμ μμ±νμΈμ.
$ mkdir ~/.aws
$ touch ~/.aws/credentials
"~/.aws/credentials" νμΌμ νλ‘κ·Έλλ° λ°©μμΌλ‘ AWSμ μ κ·Όν μ μκ² ν΄μ£Όλ μ격μ¦λͺ μ΄ ν¬ν¨λμ΄ μμΌλ©° μ΄λ AWS credentials μ κ΄λ¦¬νλ νμ€νλ λ°©λ²μ λλ€. λ¬ΈμνΈμ§κΈ°λ‘ μ΄ νμΌμ μ΄μ΄ λΉμ μ Access key ID μ Secret access keyλ₯Ό μλ νμμΌλ‘ μ λ ₯ν©λλ€.
[defold-liveupdate-example]
aws_access_key_id = <Access key ID>
aws_secret_access_key = <Secret access key>
μ΄ defold-liveupdate-example μμ μμ <>κ΄νΈ μμ μ§μ ν΄μΌ νλ μλ³μλ Defold νΈμ§κΈ°μμ νλ‘μ νΈμ λΌμ΄λΈ μ λ°μ΄νΈ μ ν μ ꡬμ±ν λ μ 곡νλ μλ³μμ λμΌν©λλ€.
λ©λνμ€νΈλ κ° λ¦¬μμ€μ ν΄μ¬κ° λΏλ§ μλλΌ λΉλμ ν¬ν¨λ λͺ¨λ 리μμ€λ€μ λͺ©λ‘μ λ€κ³ μλ λ΄λΆ λ°μ΄ν° ꡬ쑰(internal data structure)μ λλ€. λΌμ΄λΈ μ λ°μ΄νΈ κΈ°λ₯μ λ©λνμ€νΈλ₯Ό μ¬μ©νμ¬ λΉλλ κ²μμ ννΈλ₯Ό μΆμ²νκ³ , λ‘λν μ μλ μΈλΆ μμ€λ₯Ό λμ΄νκ³ , λ‘λλ λ°μ΄ν°κ° μμλμ§ μμλμ§ νμΈν©λλ€.
μ μ κ΄μ μμ λ©λνμ€νΈλ μ«μ νΈλ€(numeric handle)μ΄λ©°, μμ§μ κ΄λ¦¬νλ μΈλΆ μ 보λ λ¨κ²¨ λ‘λλ€.
νμ¬λ μ΄κΈ° λΉλ λ©λνμ€νΈ(initial build manifest)λ§ μ¬μ© κ°λ₯ν©λλ€. μ λ©λνμ€νΈλ₯Ό μ μ₯νλ κΈ°λ₯μ μμ€ν μ κ³νλ μ λ°μ΄νΈ μ¬νμ λλ€. μ΄λ μλ €μ§μ§ μμ μΆνλ κ²μμ 리μμ€λ₯Ό λΉλ νμμ μμ νκ±°λ μΆκ°ν μ μκ² ν΄ μ€λλ€.
κ²μμ λ²λ€ λ²μ μΌλ‘ μ€ννλ©΄, μ½μμ μ§μ μ‘μΈμ€ ν μ μκ² λμ΄ λλ²κΉ μ λ¬Έμ κ° λ°μν©λλ€. νμ§λ§, 컀맨λ λΌμΈ νΉμ λ²λ€ λλ ν 리μ μ€ννμΌμ μ§μ λλΈν΄λ¦ν΄μ μ΄λΈλ¦¬μΌμ΄μ μ μ€ν ν μ μμ΅λλ€.
μ΄μ κ²μμ΄ μμλκ³ μ μλμ°μ print() λ¬Έμ μΆλ ₯νκ² λ©λλ€.
μ΄ν리μΌμ΄μ μ΄ λ¦¬μμ€λ₯Ό μ μ₯νλ € νλ©΄, λ‘컬 μ»΄ν¨ν°λ ν΄λμ₯μΉμ λμ€ν¬μ μ μ₯λ©λλ€. λ§μ½ μ΄ν리μΌμ΄μ μ μ¬μμν΄λ, μ΄ λ¦¬μμ€λ€μ μ¬μ ν κ·Έλλ‘ μμ΅λλ€. κ°λ°μ€μΈ κ²½μ°λ λλ‘ λ¦¬μμ€λ€μ μμ ν΄μΌν κ²½μ°λ μκ³ κ°μ λ‘ λ€μ λ€μ΄λ‘λ ν΄μΌν κ²½μ°λ μμ΅λλ€. sys.get_save_file() ν¨μλ Defoldκ° λ¦¬μμ€λ₯Ό μ μ₯νλ κ²½λ‘λ₯Ό λ°νν©λλ€. μ ν΄λμμ, Defoldλ μμ±λ λ²λ€μ ν΄μ¬ μ΄λ¦μ μ¬μ©νμ¬ ν΄λλ₯Ό λ§λλλ€. λ§μ½ μ΄ ν΄λμ νμΌλ€μ μμ νλ©΄, μ΄ν리μΌμ΄μ μ λ©λνμ€νΈμ 리μμ€λ₯Ό 무ν¨μ²λ¦¬(invalidate) νλ―λ‘ λΉμ μ μ΄λ₯Ό λ€μ λ€μ΄λ‘λνκ³ μ μ₯ν μ μκ² λ©λλ€.
-
νμ¬λ λΉλνμμ μμ±ν λ©λνμ€νΈλ§ μ‘μΈμ€ν μ μμ΅λλ€. κ°κΉμ΄ μμΌ λ΄μ μ λ©λνμ€νΈλ₯Ό μ μ₯νλλ‘ ν μμ μ λλ€. μ΄λ κΈ°μ‘΄ 리μμ€λ₯Ό μμ νκ±°λ λΌμ΄λΈ μ λ°μ΄νΈλ₯Ό ν΅ν΄ μ 리μμ€λ₯Ό κ²μμ μΆκ°ν μ μκ² ν΄ μ€λλ€.
-
νμ¬ resource.store_resource() λ λ©μΈ μ€λ λλ₯Ό μ°¨λ¨(block)νκ³ μμ΅λλ€. μ¦, ν° λ¦¬μμ€λ₯Ό μ μ₯νλ©΄ λκΉ νμμ΄ λ°μν μ μμ΅λλ€.











