ਜਾਣੋ ਕਿ Lua ਇੰਬੈੱਡਿੰਗ ਅਤੇ ਖੇਡ ਸਕ੍ਰਿਪਟਿੰਗ ਲਈ ਕਿਉਂ ਉਚਿਤ ਹੈ: ਛੋਟਾ ਫੁੱਟਪ੍ਰਿੰਟ, ਤੇਜ਼ ਰਨਟਾਈਮ, ਸਧਾਰਣ C API, ਕੋਰੋਟਾਈਨ, ਸੁਰੱਖਿਆ ਵਿਕਲਪ ਅਤੇ ਵਧੀਆ ਪੋਰਟੇਬਿਲਟੀ।

"ਇੰਬੈੱਡਿੰਗ" ਕਿਸੇ ਸਕ੍ਰਿਪਟਿੰਗ ਭਾਸ਼ਾ ਦਾ ਮਤਲਬ ਹੈ ਕਿ ਤੁਹਾਡਾ ਐਪਲੀਕੇਸ਼ਨ (ਉਦਾਹਰਨ ਲਈ, ਇੱਕ ਗੇਮ ਇੰਜਣ) ਅੰਦਰ ਹੀ ਇੱਕ ਰਨਟਾਈਮ ਰੱਖਦਾ ਹੈ, ਅਤੇ ਤੁਹਾਡਾ ਕੋਡ ਉਸ ਰਨਟਾਈਮ ਨੂੰ ਕਾਲ ਕਰਕੇ ਸਕ੍ਰਿਪਟਾਂ ਲੋਡ ਅਤੇ ਚਲਾਉਂਦਾ ਹੈ। ਖਿਡਾਰੀ Lua ਨੂੰ ਅਲੱਗ ਤੌਰ 'ਤੇ ਸ਼ੁਰੂ ਨਹੀਂ ਕਰਦੇ, ਇੰਸਟਾਲ ਨਹੀਂ ਕਰਦੇ, ਜਾਂ ਪੈਕੇਜ ਮੈਨੇਜ ਨਹੀਂ ਕਰਦੇ; ਇਹ ਸਿੱਧਾ ਗੇਮ ਦਾ ਹਿੱਸਾ ਹੁੰਦਾ ਹੈ।
ਇਸਦੇ ਉਲਟ, ਸਟੈਂਡਅਲੋਨ ਸਕ੍ਰਿਪਟਿੰਗ ਉਹ ਹੁੰਦੀ ਹੈ ਜਦੋਂ ਇੱਕ ਸਕ੍ਰਿਪਟ ਆਪਣੀ ਅਲੱਗ ਇੰਟਰਪ੍ਰੀਟਰ ਜਾਂ ਟੂਲ ਵਿੱਚ ਚਲਦੀ ਹੈ (ਜਿਵੇਂ ਕਮਾਂਡ ਲਾਈਨ ਤੋਂ ਸਕ੍ਰਿਪਟ ਚਲਾਉਣਾ)। ਇਹ ਆਟੋਮੇਸ਼ਨ ਲਈ ਵਧੀਆ ਹੋ ਸਕਦਾ ਹੈ, ਪਰ ਇਹ ਇੱਕ ਵੱਖਰਾ ਮਾਡਲ ਹੁੰਦਾ ਹੈ: ਤੁਹਾਡੀ ਐਪ ਹੋਸਟ ਨਹੀਂ ਹੁੰਦੀ; ਇੰਟਰਪ੍ਰੀਟਰ ਹੁੰਦਾ ਹੈ।
ਖੇਡ ਵੱਖ-ਵੱਖ ਸਿਸਟਮਾਂ ਦਾ ਮਿਲਾਪ ਹੁੰਦੇ ਹਨ ਜਿਨ੍ਹਾਂ ਨੂੰ ਵੱਖ-ਵੱਖ iteration ਸਪੀਡ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ। ਨੀਵੀਂ ਪਾਤਰ ਦੀ ਇੰਜਣ ਕੋਡ (ਰੇਂਡਰਿੰਗ, ਫਿਜ਼ਿਕਸ, ਥ੍ਰੇਡਿੰਗ) C/C++ ਦੇ ਪ੍ਰਦਰਸ਼ਨ ਅਤੇ ਸਖਤ ਨਿਯੰਤਰਣ ਤੋਂ ਲਾਭ ਲੈਂਦੀ ਹੈ। ਗੇਮਪਲੇ ਲੋਜਿਕ, UI ਫਲੋਜ਼, ਕਵੈਸਟਸ, ਆਇਟਮ ਟਿਊਨਿੰਗ ਅਤੇ ਦੁਸ਼ਮਣਾਂ ਦੇ ਵਿਹਾਰ ਤੇਜ਼ੀ ਨਾਲ ਸੰਪਾਦਿਤ ਹੋ ਸਕਦੇ ਹਨ ਬਿਨਾਂ ਪੂਰੀ ਤਰ੍ਹਾਂ ਗੇਮ ਬਿਲਡ ਕੀਤੇ।
ਭਾਸ਼ਾ ਨੂੰ ਇੰਬੈੱਡ ਕਰਨ ਨਾਲ ਟੀਮਾਂ ਨੂੰ ਇਹ ਸਮਭਵ ਮਿਲਦਾ ਹੈ:
ਜਦ ਲੋਕ Lua ਨੂੰ ਇੰਬੈੱਡਿੰਗ ਲਈ “ਚੁਣੀ ਹੋਈ ਭਾਸ਼ਾ” ਕਹਿੰਦੇ ਹਨ, ਇਸਦਾ ਅਰਥ ਇਹ ਨਹੀਂ ਕਿ ਇਹ ਹਰ ਕਿਸੇ ਲਈ 완벽 ਹੈ। ਇਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਇਹ ਉਤਪਾਦਨ ਵਿੱਚ ਸੁੱਧੀ ਹੋ ਚੁੱਕੀ ਹੈ, ਇੱਕ ਪੇਸ਼ਗੀ ਇੰਟਿਗ੍ਰੇਸ਼ਨ ਪੈਟਰਨ ਹੈ, ਅਤੇ ਵਰਤੋਂਯੋਗ ਵਪਾਰ-ਬਦਲਾਵ ਕਰਦੀ ਹੈ ਜੋ ਖੇਡਾਂ ਦੇ ਨਿਕਾਸ ਲਈ موزੂਨ ਹਨ: ਇੱਕ ਛੋਟਾ ਰਨਟਾਈਮ, ਮਜ਼ਬੂਤ ਕਾਰਗੁਜ਼ਾਰੀ, ਅਤੇ ਇੱਕ C-ਦੋਸਤाना API ਜੋ ਸਾਲਾਂ ਤੋਂ ਆਜ਼ਮਾਇਆ ਗਿਆ ਹੈ।
ਹੁਣ ਅਸੀਂ Lua ਦੀ ਫੁੱਟਪ੍ਰਿੰਟ ਅਤੇ ਪ੍ਰਦਰਸ਼ਨ ਦੇਖਾਂਗੇ, C/C++ ਇਨਟੀਗ੍ਰੇਸ਼ਨ ਆਮ ਤੌਰ 'ਤੇ ਕਿਵੇਂ ਕੰਮ ਕਰਦੀ ਹੈ, ਕੋਰੋਟਾਈਨਸ ਗੇਮਪਲੇ ਫਲੋ ਲਈ ਕੀ ਕੁਝ ਕਰਦੀਆਂ ਹਨ, ਅਤੇ ਟੇਬਲ/ਮੇਟਾਟੇਬਲ ਡੇਟਾ-ਡ੍ਰਾਈਵਨ ਡਿਜ਼ਾਈਨ ਨੂੰ ਕਿਵੇਂ ਸਹਾਰਦੇ ਹਨ। ਅਸੀਂ ਸੈਂਡਬਾਕਸਿੰਗ ਵਿਕਲਪਾਂ, ਰੱਖ-ਰਖਾਅ, ਟੂਲਿੰਗ, ਹੋਰ ਭਾਸ਼ਾਵਾਂ ਨਾਲ ਤੁਲਨਾ ਅਤੇ ਇੱਕ ਚੈੱਕਲਿਸਟ ਵੀ ਦੇਵਾਂਗੇ ਤਾਂ ਕਿ ਤੁਸੀਂ ਨਿਰਣੈ ਕਰ ਸਕੋ ਕਿ Lua ਤੁਹਾਡੇ ਇੰਜਣ ਲਈ ਢੁਕਵਾਂ ਹੈ ਜਾਂ ਨਹੀਂ।
Lua ਦਾ ਇੰਟਰਪ੍ਰੀਟਰ ਪ੍ਰਸਿੱਧ ਤੌਰ 'ਤੇ ਛੋਟਾ ਹੈ। ਇਹ ਖੇਡਾਂ ਵਿੱਚ ਮਹੱਤਵਪੂਰਨ ਹੈ ਕਿਉਂਕਿ ਹਰ ਵਾਧੂ ਮੇਗਾਬਾਈਟ ਡਾਉਨਲੋਡ ਆਕਾਰ, ਪੈਚ ਸਮਾਂ, ਮੈਮੋਰੀ ਦਬਾਉ ਅਤੇ ਕੁਝ ਪਲੇਟਫਾਰਮਾਂ ਉੱਤੇ ਪ੍ਰਮਾਣਨ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕਰਦਾ ਹੈ। ਇੱਕ ਕੰਪੈਕਟ ਰਨਟਾਈਮ ਆਮ ਤੌਰ 'ਤੇ ਤੇਜ਼ੀ ਨਾਲ ਸ਼ੁਰੂ ਹੁੰਦਾ ਹੈ, ਜੋ ਐਡੀਟਰ ਟੂਲ, ਸਕ੍ਰਿਪਟਿੰਗ ਕਨਸੋਲ ਅਤੇ ਤੇਜ਼ iteration ਵਰਕਫਲੋਜ਼ ਲਈ ਮਦਦਗਾਰ ਹੈ।
Lua ਦਾ ਕੋਰ ਸਧਾਰਣ ਹੈ: ਘੱਟ ਹਿੱਸੇ, ਘੱਟ ਛੁਪੇ ਸਬਸਿਸਟਮ, ਅਤੇ ਇੱਕ ਮੈਮੋਰੀ ਮਾਡਲ ਜਿਸਨੂੰ ਤੁਸੀਂ ਸੋਚ-ਵਿਚਾਰ ਸਕਦੇ ਹੋ। ਬਹੁਤੀਆਂ ਟੀਮਾਂ ਲਈ ਇਹ ਅਰਥ ਹੈ ਕਿ overhead ਅੰਦਾਜ਼ੇਯੋਗ ਹੁੰਦਾ ਹੈ—ਆਪਣੇ ਇੰਜਣ ਅਤੇ ਕੰਟੈਂਟ ਆਮ ਤੌਰ 'ਤੇ ਮੈਮੋਰੀ ਵਿੱਚ ਬਹੁਤ ਜ਼ਿਆਦਾ ਹੁੰਦੇ ਹਨ, ਨਾ ਕਿ ਸਕ੍ਰਿਪਟਿੰਗ VM।
ਪੋਰਟੇਬਿਲਟੀ ਓਹੀ ਜਗ੍ਹਾ ਹੈ ਜਿਥੇ ਛੋਟਾ ਕੋਰ ਵਾਸਤਵ ਵਿੱਚ ਫ਼ਾਇਦਾ ਦਿੰਦਾ ਹੈ। Lua ਪੋਰਟੇਬਲ C ਵਿੱਚ ਲਿਖੀ ਗਈ ਹੈ ਅਤੇ ਡੈਸਕਟਾਪ, ਕਨਸੋਲ ਅਤੇ ਮੋਬਾਈਲ 'ਤੇ ਆਮ ਤੌਰ 'ਤੇ ਵਰਤੀ ਜਾਂਦੀ ਹੈ। ਜੇ ਤੁਹਾਡਾ ਇੰਜਣ ਪਹਿਲਾਂ ਹੀ ਹਰ ਟਾਰਗੇਟ 'ਤੇ C/C++ ਬਣਾਉਂਦਾ ਹੈ, ਤਾਂ ਆਮ ਤੌਰ 'ਤੇ Lua ਉਸੇ ਪਾਈਪਲਾਈਨ ਵਿੱਚ ਫਿੱਟ ਹੋ ਜਾਂਦਾ ਹੈ ਬਿਨਾਂ ਖਾਸ ਟੂਲਿੰਗ ਦੇ। ਇਹ ਪਲੇਟਫਾਰਮ ਸਪੈਰਾਈਜ਼ ਘਟਾਉਂਦਾ ਹੈ, ਜਿਵੇਂ ਵੱਖਰੇ ਵਿਵਹਾਰ ਜਾਂ ਗਾਇਬ ਰਨਟਾਈਮ ਫੀਚਰ।
Lua ਆਮ ਤੌਰ 'ਤੇ ਇੱਕ ਛੋਟੀ ਸਟੈਟਿਕ ਲਾਇਬ੍ਰੇਰੀ ਵਜੋਂ ਬਣਾਈ ਜਾਂਦੀ ਹੈ ਜਾਂ ਸਿੱਧਾ ਪ੍ਰੋਜੈਕਟ ਵਿੱਚ ਕੰਪਾਇਲ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਕੋਈ ਭਾਰੀ ਰਨਟਾਈਮ ਇੰਸਟਾਲ ਕਰਨ ਦੀ ਲੋੜ ਨਹੀਂ, ਅਤੇ ਨਾ ਹੀ ਕੋਈ ਵੱਡਾ ਡਿਪੈਂਡੈਂਸੀ ਟ੍ਰੀ ਹੈ। ਘੱਟ ਬਾਹਰੀ ਹਿੱਸੇ ਦਾ ਮਤਲਬ ਘੱਟ ਵਰਜਨ ਟਕਰਾਅ, ਘੱਟ ਸੁਰੱਖਿਆ ਅਪਡੇਟ ਚੱਕਰ, ਅਤੇ ਘੱਟ ਥਾਂ ਜਿੱਥੇ ਬਿਲਡ ਟੁੱਟ ਸਕਦੇ ਹਨ—ਖਾਸ ਕਰਕੇ ਲੰਬੇ ਸਮੇਂ ਵਾਲੇ ਗੇਮ ਬ੍ਰਾਂਚਾਂ ਲਈ ਕੀਮਤੀ।
ਹਲਕਾ ਸਕ੍ਰਿਪਟਿੰਗ ਰਨਟਾਈਮ ਸਿਰਫ਼ ਸ਼ਿਪਿੰਗ ਬਾਰੇ ਨਹੀਂ ਹੈ। ਇਹ ਸਕ੍ਰਿਪਟਾਂ ਨੂੰ ਹੋਰ ਜਗ੍ਹਾਂ ਤੇ ਲਗਾਉਣ ਯੋਗ ਬਣਾਉਂਦਾ ਹੈ—ਐਡੀਟਰ ਯੂਟਿਲਿਟੀ, ਮੋਡ ਟੂਲ, UI ਲੋਜਿਕ, ਕਵੈਸਟ ਲੋਜਿਕ, ਅਤੇ ਆਟੋਮੇਟਿਡ ਟੈਸਟ—ਬਿਨਾਂ ਇਹ ਭਾਵਨਾ ਕਿ ਤੁਸੀਂ ਆਪਣੇ ਕੋਡਬੇਸ ਵਿੱਚ "ਪੂਰੇ ਪਲੇਟਫਾਰਮ" ਜੁੜਾ ਰਹੇ ਹੋ। ਇਹ ਲਚਕੀਲਾਪਣ ਉਹੀ ਬੜੀ ਵਜ੍ਹਾ ਹੈ ਜਿਸ ਕਰਕੇ ਟੀਮਾਂ Lua ਨੂੰ ਚੁਣਦੀਆਂ ਰਹਿੰਦੀਆਂ ਹਨ।
ਗੇਮ ਟੀਮਾਂ ਆਮ ਤੌਰ 'ਤੇ ਚਾਹੁੰਦੀਆਂ ਹਨ ਕਿ ਸਕ੍ਰਿਪਟ "ਪ੍ਰੋਜੈਕਟ ਦਾ ਸਭ ਤੋਂ ਤੇਜ਼ ਕੋਡ" ਹੋਣ; ਇਸ ਦੀ ਲੋੜ ਨਹੀਂ ਹੁੰਦੀ। ਉਹ ਚਾਹੁੰਦੀਆਂ ਹਨ ਕਿ ਸਕ੍ਰਿਪਟ ਐਨਸੋਸਰਾਂ ਦੇ ਅੰਦਰ ਕਰ ਸਕਣ—ਜੇ ਡਿਜ਼ਾਈਨਰ iteration ਕਰਦਾ ਹੈ ਤਾਂ ਫਰੇਮ ਰੇਟ ਨਾਂ ਡਿੱਗੇ, ਅਤੇ ਅਚਾਨਕ spikes ਆਸਾਨੀ ਨਾਲ diagnose ਹੋ ਸਕਣ।
ਅਧਿਕ ਤਿਆਰਖੇਡਾਂ ਲਈ, "ਤੇਜ਼ ਕਾਫੀ" ਪ੍ਰਤੀ ਫਰੇਮ ਮਿਲੀਸਕਿੰਡ ਦੇ ਬਜਟ ਵਿੱਚ ਮਾਪਿਆ ਜਾਂਦਾ ਹੈ। ਜੇ ਤੁਹਾਡਾ ਸਕ੍ਰਿਪਟਿੰਗ ਕੰਮ gameplay ਲੋਜਿਕ ਲਈ ਦਿੱਤੇ ਗਏ slice ਵਿੱਚ ਰਹਿੰਦਾ ਹੈ (ਅਕਸਰ ਕੁੱਲ ਫਰੇਮ ਦਾ ਇਕ ਹਿੱਸਾ), ਤਾਂ ਖਿਡਾਰੀ ਨੂੰ ਮਹਿਸੂਸ ਨਹੀਂ ਹੋਵੇਗਾ। ਲਕੜੀ ਦਾ ਲੱਖਣ optimized C++ ਨੂੰ ਹਰ ਰੋਜ਼ ਹਰ ਚੀਜ਼ 'ਤੇ ਹਰਾ ਦੇਣਾ ਨਹੀਂ, ਸਗੋਂ ਪ੍ਰਤੀ-ਫਰੇਮ ਸਕ੍ਰਿਪਟ ਕੰਮ ਨੂੰ ਸਥਿਰ ਰੱਖਣਾ ਅਤੇ ਅਚਾਨਕ ਗਾਰਬੇਜ ਜਾਂ ਐਲੋਕੇਸ਼ਨ ਬਰਸਟ ਤੋਂ ਬਚਣਾ ਹੈ।
Lua ਕੋਡ ਨੂੰ ਇੱਕ ਛੋਟੇ ਵਰਚੁਅਲ ਮਸ਼ੀਨ ਵਿੱਚ ਚਲਾਉਂਦਾ ਹੈ। ਤੁਹਾਡਾ ਸੋਰਸ ਬਾਈਟਕੋਡ ਵਿੱਚ ਕੰਪਾਇਲ ਹੁੰਦਾ ਹੈ, ਫਿਰ VM ਦੁਆਰਾ ਚਲਾਇਆ ਜਾਂਦਾ ਹੈ। ਉਤਪਾਦਨ ਵਿੱਚ, ਇਹ ਪ੍ਰੀਕੰਪਾਈਲਡ ਚੰਕ ਸ਼ਿਪ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਰਨਟਾਈਮ 'ਤੇ ਪਾਰਸਿੰਗ ਦਾ ਓਵਰਹੈੱਡ ਘਟਦਾ ਹੈ ਅਤੇ ਨਿਰ੍ਵਿਚਿਤ ਚਲਣਾ ਯਕੀਨੀ ਰਹਿੰਦਾ ਹੈ।
Lua ਦਾ VM ਉਹਨਾਂ ਆਪਰੇਸ਼ਨਾਂ ਲਈ ਟਿਊਨ ਕੀਤਾ ਗਿਆ ਹੈ ਜੋ ਸਕ੍ਰਿਪਟਾਂ ਬਾਰ-ਬਾਰ ਕਰਦੀਆਂ ਹਨ—ਫੰਕਸ਼ਨ ਕਾਲਾਂ, ਟੇਬਲ ਐਕਸੈਸ, ਅਤੇ ਬ੍ਰਾਂਚਿੰਗ—ਇਸ ਲਈ ਆਮ ਗੇਮਪਲੇ ਲੋਜਿਕ ਸੰਕੁਚਿਤ ਪਲੇਟਫਾਰਮਾਂ 'ਤੇ ਵੀ ਚੰਗੀ ਤਰ੍ਹਾਂ ਚੱਲਦੀ ਹੈ।
Lua ਆਮ ਤੌਰ 'ਤੇ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ:
Lua ਆਮ ਤੌਰ 'ਤੇ ਉਹਨਾਂ ਹੌਟ ਇੰਨਰ ਲੂਪਾਂ ਲਈ ਵਰਤੀ ਨਹੀਂ ਜਾਂਦੀ, ਜਿਵੇਂ ਫਿਜ਼ਿਕਸ ਇੰਟੀਗ੍ਰੇਸ਼ਨ, ਐਨੀਮੇਸ਼ਨ ਸਕਿਨਿੰਗ, ਪਾਥਫਾਈਂਡਿੰਗ ਕੋਰ ਨੁਕਤੇ, ਜਾਂ ਪਾਰਟੀਕਲ ਸਿਮੂਲੇਸ਼ਨ। ਉਹਨਾਂ ਨੂੰ C/C++ ਵਿੱਚ ਰੱਖਿਆ ਜਾਂਦਾ ਹੈ ਅਤੇ Lua ਨੂੰ ਉੱਚ-ਸਤਰ ਦੇ ਫੰਕਸ਼ਨਾਂ ਰਾਹੀਂ ਐਕਸਪੋਜ਼ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।
ਕੁਝ ਆਦਤਾਂ Lua ਨੂੰ ਅਸਲ ਪ੍ਰੋਜੈਕਟਾਂ ਵਿੱਚ ਤੇਜ਼ ਰੱਖਦੀਆਂ ਹਨ:
Lua ਨੇ ਖੇਡ ਇੰਜਣਾਂ ਵਿੱਚ ਆਪਣੀ ਸ਼ੋਹਰਤ ਇਸ ਲਈ ਕਮਾਈ ਹੈ ਕਿਉਂਕਿ ਇਸ ਦੀ ਇੰਟੀਗ੍ਰੇਸ਼ਨ ਕਹਾਣੀ ਸਧਾਰਣ ਅਤੇ ਪੇਸ਼ਗੀਯੋਗ ਹੈ। Lua ਇੱਕ ਛੋਟੀ C ਲਾਇਬ੍ਰੇਰੀ ਵਜੋਂ ਆਉਂਦਾ ਹੈ, ਅਤੇ Lua C API ਇੱਕ ਸਪਸ਼ਟ ਵਿਚਾਰ ਦੇ ਆਸ-ਪਾਸ ਡਿਜ਼ਾਇਨ ਕੀਤਾ ਗਿਆ ਹੈ: ਤੁਹਾਡਾ ਇੰਜਣ ਅਤੇ ਸਕ੍ਰਿਪਟ ਇੱਕ ਸਟੈਕ-ਬੇਸਡ ਇੰਟਰਫੇਸ ਰਾਹੀਂ ਗੱਲ ਕਰਦੇ ਹਨ।
ਇੰਜਣ ਪਾਸੇ, ਤੁਸੀਂ ਇੱਕ Lua state ਬਣਾਉਂਦੇ ਹੋ, ਸਕ੍ਰਿਪਟ ਲੋਡ ਕਰਦੇ ਹੋ, ਅਤੇ ਫੰਕਸ਼ਨਾਂ ਨੂੰ ਕਾਲ ਕਰਦੇ ਹੋ ਵੈਲਿਊਜ਼ ਨੂੰ ਸਟੈਕ 'ਤੇ ਧੱਕਕੇ। ਇਹ "ਜਾਦੂ" ਨਹੀਂ ਹੈ, ਜੋ ਕਿ ਠੀਕ ਹੀ ਹੈ: ਇਹ ਭਰੋਸੇਯੋਗ ਬਣਾਉਂਦਾ ਹੈ—ਤੁਸੀਂ ਹਰ ਵੈਲਿਊ ਜੋ ਬਾਊਂਡਰੀ ਨੂੰ ਪਾਰ ਕਰਦੀ ਹੈ ਨੂੰ ਦੇਖ ਸਕਦੇ ਹੋ, ਟਾਈਪ ਵੈਰੀਫਾਈ ਕਰ ਸਕਦੇ ਹੋ, ਅਤੇ ਫੈਸਲਾ ਕਰ ਸਕਦੇ ਹੋ ਕਿ errors ਕਿਵੇਂ ਹੈਂਡਲ ਕਰਨੇ ਹਨ।
ਇੱਕ ਆਮ ਕਾਲ ਫਲੋ ਹੈ:
C/C++ → Lua ਜਾਣਾ ਸਕ੍ਰਿਪਟਡ ਫੈਸਲਿਆਂ ਲਈ ਵਧੀਆ ਹੈ: AI ਚੋਣਾਂ, ਕਵੈਸਟ ਲੋਜਿਕ, UI ਨਿਯਮ, ਜਾਂ ਐਬਿਲਿਟੀ ਫਾਰਮੂਲੇ।
Lua → C/C++ ਜਾਣਾ ਇੰਜਣ ਕਾਰਜਾਂ ਲਈ ਬਿਹਤਰ ਹੈ: ਏਨਟੀਟੀ ਸਪੌਨ ਕਰਨਾ, ਆਡੀਓ ਚਲਾਉਣਾ, ਫਿਜ਼ਿਕਸ ਕ્વੈਰੀ ਕਰਨਾ, ਜਾਂ ਨੈੱਟਵਰਕ ਸੁਨੇਹੇ ਭੇਜਣਾ। ਤੁਸੀਂ C ਫੰਕਸ਼ਨਾਂ ਨੂੰ Lua ਨੂੰ ਐਕਸਪੋਜ਼ ਕਰਦੇ ਹੋ, ਆਮ ਤੌਰ 'ਤੇ ਮੋਡੀਊਲ-ਸਟਾਈਲ ਟੇਬਲ ਵਿੱਚ ਗਰੁੱਪ ਕਰਕੇ:
lua_register(L, "PlaySound", PlaySound_C);
ਸਕ੍ਰਿਪਟਿੰਗ ਪਾਸੇ ਤੋਂ ਕਾਲ ਕੁਦਰਤੀ ਹੁੰਦੀ ਹੈ:
PlaySound("explosion_big")
ਹੱਥੋਂ-ਲਿਖੀਆਂ ਬਾਈਂਡਿੰਗਾਂ (ਹਾਂਡਰਿਟਨ ਗਲੂ) ਛੋਟੀਆਂ ਅਤੇ ਸਪਸ਼ਟ ਰਹਿੰਦੀਆਂ ਹਨ—ਜਦੋਂ ਤੁਸੀਂ ਸਿਰਫ਼ ਇੱਕ ਚੁਣੀ ਹੋਈ API ਸਰਫੇਸ ਐਕਸਪੋਜ਼ ਕਰਦੇ ਹੋ तब ਇਹ ਬੇਹਤਰ ਹੈ।
ਜਨੇਰੇਟਰ (SWIG-ਸਟਾਈਲ ਅਪ੍ਰੋਚ ਜਾਂ ਕਸਟਮ ਰਿਫਲੈਕਸ਼ਨ ਟੂਲ) ਵੱਡੀਆਂ APIs ਨੂੰ ਤੇਜ਼ੀ ਨਾਲ ਕਵਰ ਕਰ ਸਕਦੇ ਹਨ, ਪਰ ਉਹ ਬਹੁਤ ਕੁਝ ਐਕਸਪੋਜ਼ ਕਰ ਸਕਦੇ ਹਨ, ਤੁਹਾਨੂੰ ਕਿਸੇ ਪੈਟਰਨ 'ਤੇ ਲਾਕ ਕਰ ਸਕਦੇ ਹਨ, ਜਾਂ ਗੁੰਝਲਦਾਰ ਏਰਰ ਸੁਨੇਹੇ ਪੈਦਾ ਕਰ ਸਕਦੇ ਹਨ। ਬਹੁਤੀਆਂ ਟੀਮਾਂ ਦੋਹਾਂ ਨੂੰ ਮਿਲਾ ਕੇ ਵਰਤਦੀਆਂ ਹਨ: ਡੇਟਾ ਟਾਈਪਾਂ ਲਈ ਜਨੇਰੇਟਰ, ਅਤੇ ਗੇਮਪਲੇ-ਫੇਸਿੰਗ ਫੰਕਸ਼ਨਾਂ ਲਈ ਮੈਨੁਅਲ ਬਾਈਂਡਿੰਗ।
ਚੰਗੀ ਤਰ੍ਹਾਂ ਬਣੇ ਇੰਜਣ ਆਮ ਤੌਰ 'ਤੇ "ਸਭ ਕੁਝ" Lua ਵਿੱਚ ਨਹੀਂ ਸੁੱਟਦੇ। ਇਸਦੀ ਜਗ੍ਹਾ, ਉਹ ਧਿਆਨ ਕੇਂਦਰਿਤ ਸੇਵਾਵਾਂ ਅਤੇ ਕੰਪੋਨੈਂਟ APIs ਐਕਸਪੋਜ਼ ਕਰਦੇ ਹਨ:
ਇਹ ਵੰਡ ਸਕ੍ਰਿਪਟਾਂ ਨੂੰ ਪ੍ਰਸੰਨਤਾ ਦਿੰਦੀ ਹੈ ਜਦਕਿ ਇੰਜਣ ਪ੍ਰਦਰਸ਼ਨ-ਮਹੱਤਵਪੂਰਨ ਸਿਸਟਮਾਂ ਅਤੇ ਗਾਰਡਰੇਲਜ਼ 'ਤੇ ਨਿਯੰਤਰਣ ਬਣਾਈ ਰੱਖਦਾ ਹੈ।
Lua ਕੋਰੋਟਾਈਨ ਗੇਮਪਲੇ ਲੋਜਿਕ ਲਈ ਕੁਦਰਤੀ ਮਿਲਾਪ ਹਨ ਕਿਉਂਕਿ ਉਹ ਸਕ੍ਰਿਪਟਾਂ ਨੂੰ ਰੋਕਣ ਅਤੇ ਮੁੜ ਸ਼ੁਰੂ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੇ ਹਨ ਬਿਨਾਂ ਪੂਰੇ ਖੇਡ ਨੂੰ ਫ੍ਰੀਜ਼ ਕੀਤੇ। ਬਹੁਤ ਸਾਰੇ ਕਵੈਸਟ ਜਾਂ ਕੱਟਸੀਨ ਨੂੰ ਦਰਜ-ਦਰਜ ਵੇਖਦੇ ਹੋਏ ਤੁਹਾਨੂੰ state flags ਦੀ ਲੜੀ ਬਣਾਉਣ ਦੀ ਜਰੂਰਤ ਨਹੀਂ ਰਹਿੰਦੀ; ਤੁਸੀਂ ਇਸਨੂੰ ਸਿੱਧੇ, ਪੜ੍ਹਨ ਯੋਗ ਅਨੁਕ੍ਰਮ ਵਜੋਂ ਲਿਖ ਸਕਦੇ ਹੋ—ਅਤੇ ਜਦੋਂ ਲੋੜ ਹੋਵੇ ਤਾਂ ਇੰਜਣ ਨੂੰ yield ਕਰ ਦਿਓ।
ਜ਼ਿਆਦਾਤਰ ਗੇਮਪਲੇ ਕੰਮ ਕਦਮ-ਬਦਲ ਕੇ ਹੁੰਦੇ ਹਨ: ਇੱਕ ਡਾਇਲਾਗ ਦੀ ਲਾਈਨ ਦਿਖਾਓ, ਖਿਡਾਰੀ ਲਈ ਇੰਪੁੱਟ ਦੀ ਉਡੀਕ ਕਰੋ, ਇੱਕ ਐਨੀਮੇਸ਼ਨ ਚਲਾਓ, 2 ਸਕਿੰਟ ਉਡੀਕ ਕਰੋ, ਦੁਸ਼ਮਣ ਸਪੌਨ ਕਰੋ, ਆਦਿ। ਕੋਰੋਟਾਈਨਾਂ ਨਾਲ, ਹਰ ਉਡੀਕ ਬਿੰਦੂ ਸਿਰਫ਼ ਇੱਕ yield() ਹੈ। ਇੰਜਣ ਉਸ ਕੋਰੋਟਾਈਨ ਨੂੰ ਬਾਅਦ ਵਿੱਚ ਉਸ ਸਮੇਂ resume ਕਰਦਾ ਹੈ ਜਦੋਂ ਸ਼ਰਤ ਪੂਰੀ ਹੋਵੇ।
ਕੋਰੋਟਾਈਨ ਸਹਿਯੋਗੀ ਹੁੰਦੇ ਹਨ, ਪ੍ਰੀਅਮਪਟਿਵ ਨਹੀਂ। ਇਹ ਖੇਡਾਂ ਲਈ ਇੱਕ ਫਾਇਦਾ ਹੈ: ਤੁਸੀਂ ਬਿਲਕੁਲ ਫੈਸਲਾ ਕਰਦੇ ਹੋ ਕਿ ਸਕ੍ਰਿਪਟ ਕਿੱਥੇ ਰੁਕ ਸਕਦੀ ਹੈ, ਜਿਸ ਨਾਲ ਵਿਹਾਰ ਪੇਸ਼ਗੋਈਯੋਗ ਰਹਿੰਦਾ ਹੈ ਅਤੇ ਕਈ ਥ੍ਰੈੱਡ-ਸੁਰੱਖਿਆ ਸਮੱਸਿਆਵਾਂ (ਲੌਕ, ਰੇਸ, ਸਾਂਝਾ ਡੇਟਾ ਟਕਰਾਅ) ਤੋਂ ਬਚਾਅ ਹੁੰਦਾ ਹੈ। ਤੁਹਾਡਾ ਗੇਮ ਲੂਪ ਫਰੇਮ ਵਿੱਚ ਰਹਿੰਦਾ ਹੈ।
ਇੱਕ ਆਮ ਅਪ੍ਰੋਚ ਇੰਜਣ ਫੰਕਸ਼ਨਾਂ wait_seconds(t), wait_event(name), ਜਾਂ wait_until(predicate) ਪ੍ਰਦਾਨ ਕਰਨੀ ਹੈ ਜੋ ਅੰਦਰੂਨੀ ਤੌਰ 'ਤੇ yield ਕਰਦੀਆਂ ਹਨ। ਸ਼ੈਡਿਊਲਰ (ਆਮ ਤੌਰ 'ਤੇ ਚੱਲ ਰਹੀਆਂ ਕੋਰੋਟਾਈਨਾਂ ਦੀ ਇੱਕ ਸਾਦਾ ਲਿਸਟ) ਹਰ ਫਰੇਮ ਟਾਈਮਰ/ਇਵੈਂਟ ਜਾਂਚਦਾ ਹੈ ਅਤੇ ਓਹ ਕੋਰੋਟਾਈਨ resume ਕਰਦਾ ਹੈ ਜੋ ਤਿਆਰ ਹੋਵੇ।
ਨਤੀਜਾ: ਸਕ੍ਰਿਪਟ ਐਸਿੰਕ ਮਹਿਸੂਸ ਕਰਦੇ ਹਨ, ਪਰ ਉਹ ਆਸਾਨੀ ਨਾਲ ਸੋਚਣਯੋਗ, ਡਿਬੱਗ ਕਰਨਯੋਗ ਅਤੇ deterministic ਰਹਿੰਦੇ ਹਨ।
Lua ਦੀ "ਰਾਜ਼ੀ ਹਥਿਆਰ" ਖੇਡ ਸਕ੍ਰਿਪਟਿੰਗ ਲਈ ਟੇਬਲ ਹੈ। ਇੱਕ ਟੇਬਲ ਇੱਕ ਹੀ ਹਲਕੀ ਬਣਤਰ ਹੈ ਜੋ ਇੱਕ object, ਇੱਕ ਡਿਕਸ਼ਨਰੀ, ਇੱਕ ਲਿਸਟ, ਜਾਂ ਇੱਕ ਨੈਸਟਡ ਕਨਫਿਗਰੇਸ਼ਨ ਬਲਾਬ ਵਜੋਂ ਕੰਮ ਕਰ ਸਕਦੀ ਹੈ। ਇਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਤੁਸੀਂ gameplay ਡੇਟਾ ਨੂੰ ਮਾਡਲ ਕਰ ਸਕਦੇ ਹੋ ਬਿਨਾਂ ਨਵਾਂ ਫਾਰਮੈਟ ਬਣਾਉਣ ਜਾਂ ਭਾਰੀ ਪਾਰਸਿੰਗ ਕੋਡ ਲਿਖਣ ਦੀ ਲੋੜ।
ਹਰ ਪੈਰਾਮੀਟਰ ਨੂੰ C++ ਵਿੱਚ ਹਾਰਡ-ਕੋਡ ਕਰਨ ਦੀ ਥਾਂ (ਅਤੇ ਮੁੜ-ਕੰਪਾਇਲ ਕਰਨ ਦੀ ਲੋੜ), ਡਿਜ਼ਾਈਨਰ ਸਧਾਰਨ ਟੇਬਲਾਂ ਵਜੋਂ ਕੰਟੈਂਟ ਪ੍ਰਗਟ ਕਰ ਸਕਦੇ ਹਨ:
Enemy = {
id = "slime",
hp = 35,
speed = 2.4,
drops = { "coin", "gel" },
resist = { fire = 0.5, ice = 1.2 }
}
ਇਹ ਸਕੇਲ ਕਰਦਾ ਹੈ: ਜਦੋਂ ਲੋੜ ਹੋਵੇ ਨਵਾਂ ਫੀਲਡ ਜੋੜੋ, ਨਾ ਹੋਣ 'ਤੇ ਛੱਡ ਦਿਓ, ਅਤੇ ਪੁਰਾਣਾ ਕੰਟੈਂਟ ਚਲਦਾ ਰਹੇ।
ਟੇਬਲਾਂ ਵਜੋਂ ਪ੍ਰੋਟੋਟਾਈਪ ਗੇਮਪਲੇ ਆਬਜੈਕਟ (ਹਥਿਆਰ, ਕਵੈਸਟ, ਅਬਿਲਿਟੀ) ਤੇਜ਼ੀ ਨਾਲ ਬਣਾਉਣ ਅਤੇ ਟਿਊਨ ਕਰਨ ਲਈ ਕੁਦਰਤੀ ਹਨ। iteration ਦੌਰਾਨ, ਤੁਸੀਂ ਇੱਕ ਬਿਹੇਵਿਅਰ ਫਲੈਗ ਬਦਲ ਸਕਦੇ ਹੋ, cooldown ਨੂੰ ਟਵੀਕ ਕਰ ਸਕਦੇ ਹੋ, ਜਾਂ ਵਿਸ਼ੇਸ਼ ਨਿਯਮਾਂ ਲਈ ਇੱਕ ਵਿਕਲਪੀ ਸਬ-ਟੇਬਲ ਜੋੜ ਸਕਦੇ ਹੋ ਬਿਨਾਂ ਇੰਜਣ ਕੋਡ ਨੂੰ ਛੂਹੇ।
ਮੈਟਾਟੇਬਲ ਤੁਹਾਨੂੰ ਬਹੁਤੀਆਂ ਟੇਬਲਾਂ ਨਾਲ ਸਾਂਝਾ ਵਿਹਾਰ ਲਗਾਉਣ ਦਿੰਦੇ ਹਨ—ਇੱਕ ਹਲਕੀ-ਵਜ਼ਨ ਕਲਾਸ ਸਿਸਟਮ ਵਾਂਗ। ਤੁਸੀਂ ਡਿਫੌਲਟ (ਉਦਾਹਰਨ ਲਈ, ਗੁੰਮ ਹੋਏ ਸਟੈਟਸ), ਕੰਪਿਊਟ ਕੀਤੀਆਂ ਗੁਣ, ਜਾਂ ਸਧਾਰਨ ਵਿਰਾਸਤ-ਵਾਂਗ ਦੁਹਰਾਵ ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰ ਸਕਦੇ ਹੋ, ਜਿਸ ਨਾਲ ਡੇਟਾ ਫਾਰਮੈਟ ਕੰਟੈਂਟ ਲੇਖਕਾਂ ਲਈ ਪੜ੍ਹਨਯੋਗ ਰਹਿੰਦਾ ਹੈ।
ਜਦੋਂ ਤੁਹਾਡਾ ਇੰਜਣ ਟੇਬਲਾਂ ਨੂੰ ਪ੍ਰਧਾਨ ਕੰਟੈਂਟ ਯੂਨਿਟ ਵਜੋਂ ਸਵੀਕਾਰ ਕਰਦਾ ਹੈ, ਮੋਡਸ ਸਿੱਧੀਆਂ ਹੋ ਜਾਂਦੀਆਂ ਹਨ: ਇੱਕ ਮੋਡ ਇੱਕ ਟੇਬਲ ਫੀਲਡ ਨੂੰ ਓਵਰਰਾਈਡ ਕਰ ਸਕਦਾ ਹੈ, ਡ੍ਰੌਪ ਲਿਸਟ ਵਧਾ ਸਕਦਾ ਹੈ, ਜਾਂ ਨਵਾਂ ਆਈਟਮ ਰਜਿਸਟਰ ਕਰ ਸਕਦਾ ਹੈ ਸਾਡੇ ਵਿੱਚ ਹੋਰ ਟੇਬਲ ਜੋੜ ਕੇ। ਨਤੀਜੇ ਵਜੋਂ ਤੁਹਾਡੇ ਕੋਲ ਇੱਕ ਐਸਾ ਗੇਮ ਆ ਜਾਂਦਾ ਹੈ ਜੋ ਟਿਊਨ ਕਰਨ ਵਿੱਚ ਆਸਾਨ, ਵਧਾਉਣ ਵਿੱਚ ਆਸਾਨ, ਅਤੇ ਕਮਿਊਨਿਟੀ ਕੰਟੈਂਟ ਲਈ ਇੱਕ ਦੋਸਤਾਨਾ ਵਾਤਾਵਰਣ ਬਣਾਉਂਦਾ ਹੈ—ਬਿਨਾਂ ਤੁਹਾਡੇ ਸਕ੍ਰਿਪਟਿੰਗ ਲੇਅਰ ਨੂੰ ਇੱਕ ਜਟਿਲ ਫਰੇਮਵਰਕ ਵਿਚ ਰੂਪਾਂਤਰਨ ਕਰਨ ਦੇ।
Lua ਇੰਬੈੱਡ ਕਰਨ ਦਾ ਮਤਲਬ ਇਹ ਹੈ ਕਿ ਤੁਸੀਂ ਜਿੰਨੀ ਆਜ਼ਾਦੀ ਸਕ੍ਰਿਪਟਾਂ ਨੂੰ ਦਿੰਦੇ ਹੋ, ਉਸਦੇ ਲਈ ਜਿੰਮੇਵਾਰ ਹੋ। ਸੈਂਡਬਾਕਸਿੰਗ ਉਹ ਨਿਯਮਾਂ ਦਾ ਸੈੱਟ ਹੈ ਜੋ ਸਕ੍ਰਿਪਟਾਂ ਨੂੰ ਤੁਹਾਡੇ ਦੁਆਰਾ ਦਿੱਤੇ ਗਏ gameplay APIs 'ਤੇ ਧਿਆਨ ਰੱਖਾਉਂਦਾ ਹੈ, ਜਦਕਿ ਹੋਸਟ ਮਸ਼ੀਨ, ਸੰਵੇਦਨਸ਼ੀਲ ਫਾਈਲਾਂ, ਜਾਂ ਇੰਜਣ ਅੰਦਰੂਨੀ ਹਿੱਸਿਆਂ ਤੱਕ ਪਹੁੰਚ ਰੋਕਦਾ ਹੈ ਜੋ ਤੁਸੀਂ ਸਾਂਝਾ ਨਹੀਂ ਕਰਨਾ ਚਾਹੁੰਦੇ।
ਪ੍ਰාਟਿਕਲ ਬੇਸਲਾਈਨ ਇਹ ਹੈ ਕਿ ਇੱਕ ਘੱਟ ਤੋਂ ਘੱਟ ਵਾਤਾਵਰਣ ਨਾਲ ਸ਼ੁਰੂ ਕਰੋ ਅਤੇ ਯੋਜਨਾਬੱਧ ਤਰੀਕੇ ਨਾਲ ਸਮਰੱਥਾਵਾਂ ਜੋੜੋ।
io ਅਤੇ os ਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਅਯੋਗ ਕਰ ਦਿੰਦੀਆਂ ਹਨ ਤਾਂ ਕਿ ਫਾਈਲ ਅਤੇ ਪ੍ਰੋਸੈਸ ਐਕਸੈਸ ਰੋਕਿਆ ਜਾ ਸਕੇ।loadfile ਨੂੰ ਅਯੋਗ ਕਰੋ, ਅਤੇ ਜੇ ਤੁਸੀਂ load ਦੀ ਆਗਿਆ ਦਿੰਦੇ ਹੋ ਤਾਂ ਕੇਵਲ ਪੂਰਵ-ਮਨਜ਼ੂਰ ਸਰੋਤ (ਜਿਵੇਂ ਪੈਕੇਜਡ ਕੰਟੈਂਟ) ਲਓ, ਬਦਲ ਵਿੱਚ user input ਨੂੰ ਨਾਂ ਦਿਓ।ਪੂਰੇ ਗਲੋਬਲ ਟੇਬਲ ਨੂੰ ਐਕਸਪੋਜ਼ ਕਰਨ ਦੀ ਥਾਂ, ਇੱਕ game (ਜਾਂ engine) ਟੇਬਲ ਦਿਓ ਜਿਸ ਵਿੱਚ ਤੁਸੀਂ ਉਹ ਫੰਕਸ਼ਨ ਰੱਖਦੇ ਹੋ ਜੋ ਤੁਸੀਂ ਡਿਜ਼ਾਈਨਰ ਜਾਂ ਮੋਡਰਾਂ ਨੂੰ ਕਾਲ ਕਰਨ ਲਈ ਦੇਣਾ ਚਾਹੁੰਦੇ ਹੋ।
ਸੈਂਡਬਾਕਸਿੰਗ ਇਹ ਵੀ ਹੈ ਕਿ ਸਕ੍ਰਿਪਟਾਂ ਫਰੇਮ ਨੂੰ ਫ਼੍ਰੀਜ਼ ਕਰਨ ਜਾਂ ਮੈਮੋਰੀ ਖਪਤ ਖਤਮ ਕਰਨ ਤੋਂ ਰੋਕੋ।
ਪਹਿਲੀ-ਪਾਰਟੀ ਸਕ੍ਰਿਪਟਾਂ ਨੂੰ ਮੋਡਸ ਤੋਂ ਵੱਖ ਸਮਝੋ।
Lua ਅਕਸਰ iteration ਦੀ ਗਤੀ ਲਈ ਲਿਆਉਂਦੇ ਹਨ, ਪਰ ਇਸਦੀ ਲੰਬੇ ਸਮੇਂ ਦੀ ਕੀਮਤ ਉਸ ਵੇਲੇ ਦਿੱਸਦੀ ਹੈ ਜਦ ਇੱਕ ਪ੍ਰੋਜੈਕਟ ਮਹੀਨਿਆਂ ਦੀ refactorਾਂ ਤੋਂ ਬਿਨਾਂ ਜੀਵਿਤ ਰਹਿੰਦਾ ਹੈ। ਇਸ ਲਈ ਕੁਝ ਇਰਾਦੇ ਵਾਲੇ ਅਭਿਆਸਾਂ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ।
Lua-ਦੇਖ ਰਿਹਾ API ਨੂੰ ਇੱਕ ਉਤਪਾਦ ਇੰਟਰਫੇਸ ਵਜੋਂ ਭਾਲੋ, ਨਾ ਕਿ ਆਪਣੇ C++ ਕਲਾਸਾਂ ਦਾ ਸਿੱਧਾ ਪ੍ਰਤੀਬਿੰਬ। ਇੱਕ ਛੋਟੀ ਸੇਵਾ ਸਤਹ ਐਕਸਪੋਜ਼ ਕਰੋ (spawn, play sound, query tags, start dialogue) ਅਤੇ ਇੰਜਣ ਅੰਦਰੂਨੀ ਹਿੱਸਿਆਂ ਨੂੰ ਨਿੱਜੀ ਰੱਖੋ।
ਇੱਕ ਪਤਲਾ, ਸਥਿਰ API ਬਾਊਂਡਰੀ churn ਘਟਾਉਂਦੀ ਹੈ: ਤੁਸੀਂ ਇੰਜਣ ਸਿਸਟਮਾਂ ਨੂੰ ਦੁਬਾਰਾ ਢਾਂਚਾ ਦਿੰਦੇ ਹੋ ਸਕਦੇ ਹੋ ਜਦੋਂ ਕਿ ਫੰਕਸ਼ਨ ਨਾਂ, ਆਰਗਯੂਮੈਂਟ ਸ਼ੇਪ ਅਤੇ ਰੀਟਰਨ ਵੈਲਿਊਜ਼ ਡਿਜ਼ਾਈਨਰਾਂ ਲਈ ਲਗਾਤਾਰ ਰਹਿੰਦੇ ਹਨ।
ਬਦਲਾਅ ਅਟਲ ਹਨ। ਉਹਨਾਂ ਨੂੰ ਸੰਭਾਲਣਯੋਗ ਬਣਾਉਣ ਲਈ ਆਪਣੇ ਸਕ੍ਰਿਪਟ ਮੋਡੀਊਲ ਜਾਂ ਐਕਸਪੋਜ਼ ਕੀਤੇ API ਦੀ ਵਰਜ਼ਨਿੰਗ ਕਰੋ:
ਸਧਾਰਣ API_VERSION ਕੰਸਟੈਂਟ ਵੀ Lua ਨੂੰ ਵੱਖ-ਵੱਖ ਰਸਤੇ ਚੁਣਨ ਵਿੱਚ ਮਦਦ ਕਰ ਸਕਦਾ ਹੈ।
ਹੌਟ-ਰੀਲੋਡ ਸਭ ਤੋਂ ਭਰੋਸੇਯੋਗ ਹੈ ਜਦ ਤੁਹਾਡਾ ਕੋਡ ਰੀਲੋਡ ਹੋਵੇ ਪਰ ਰਨਟਾਈਮ ਸਟੇਟ ਇੰਜਣ ਦੇ ਕੰਟਰੋਲ ਵਿੱਚ ਰਹੇ। ਉਹਨਾਂ ਸਕ੍ਰਿਪਟਾਂ ਨੂੰ ਰੀਲੋਡ ਕਰੋ ਜੋ ਅਬਿਲਿਟੀ, UI ਵਿਹਾਰ, ਜਾਂ ਕਵੈਸਟ ਨਿਯਮ ਪਰਿਭਾਸ਼ਿਤ ਕਰਦੀਆਂ ਹਨ; ਉਹਨਾਂ ਆਬਜੈਕਟਾਂ ਨੂੰ ਰੀਲੋਡ ਕਰਨ ਤੋਂ ਬਚੋ ਜਿਨ੍ਹਾਂ ਨੇ ਮੈਮੋਰੀ, ਫਿਜ਼ਿਕਸ ਬਾਡੀ, ਜਾਂ ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ ਮਾਲਕੀ ਕੀਤੇ ਹੋਣ।
ਇੱਕ ਪ੍ਰਯੋਗਿਕ ਪਹੁੰਚ ਹੈ ਮੋਡੀਊਲਜ਼ ਨੂੰ ਰੀਲੋਡ ਕਰਨਾ, ਫਿਰ ਮੌਜੂਦਾ ਐਨਟੀਟੀਆਂ 'ਤੇ ਕਾਲਬੈਕਸ ਨੂੰ ਦੁਬਾਰਾ ਬਾਈਂਡ ਕਰਨਾ। ਜੇ ਤੁਹਾਨੂੰ deeper resets ਦੀ ਲੋੜ ਹੈ, ਤਾਂ explicit reinitialize hooks ਦਿਓ ਨਾਕਿ ਮੋਡੀਊਲ ਸਾਹਮਣੇ ਪ੍ਰਭਾਵਾਂ 'ਤੇ ਨਿਰਭਰ ਰਹਿਣ।
ਜਦੋਂ ਇੱਕ ਸਕ੍ਰਿਪਟ fail ਕਰੇ, error ਨੂੰ ਇਹ ਪਹਚਾਣਨੀ ਚਾਹੀਦੀ ਹੈ:
Lua ਏਰਰਾਂ ਨੂੰ ਉਹੀ in-game console ਅਤੇ ਲੌਗ ਫਾਈਲਾਂ ਵਿੱਚ ਰੂਟ ਕਰੋ ਜੋ ਇੰਜਣ ਸੁਨੇਹਿਆਂ ਲਈ ਵਰਤੀਆਂ ਜਾਂਦੀਆਂ ਹਨ, ਅਤੇ stack traces ਨੂੰ ਬਣੀ ਰੱਖੋ। ਡਿਜ਼ਾਈਨਰ ਜ਼ਿਆਦਾ ਤੇਜ਼ੀ ਨਾਲ ਮਸਲੇ ਠੀਕ ਕਰ ਸਕਦੇ ਹਨ ਜਦ ਰਿਪੋਰਟ actionable ਟਿਕਟ ਵਰਗੀ ਲੱਗੇ, ਨਾ ਕਿ ਕੋਈ ਅਸਪਸ਼ਟ crash।
Lua ਦਾ ਸਭ ਤੋਂ ਵੱਡਾ ਟੂਲਿੰਗ ਫਾਇਦਾ ਇਹ ਹੈ ਕਿ ਇਹ ਤੁਹਾਡੇ ਇੰਜਣ ਦੇ ਉਸੀ iteration ਲੂਪ ਵਿੱਚ ਫਿੱਟ ਹੁੰਦੀ ਹੈ: ਇੱਕ ਸਕ੍ਰਿਪਟ ਲੋਡ ਕਰੋ, ਗੇਮ ਚਲਾਓ, ਨਤੀਜੇ.inspect ਕਰੋ, ਠੀਕ ਕਰੋ, ਰੀਲੋਡ ਕਰੋ। ਚਾਲਾ ਇਹ ਹੈ ਕਿ ਇਸ ਲੂਪ ਨੂੰ ਟੀਮ ਲਈ ਦਿਖਣਯੋਗ ਅਤੇ ਦੁਹਰਾਉਣਯੋਗ ਬਣਾਇਆ ਜਾਵੇ।
ਰੋਜ਼ਾਨਾ ਡਿਬੱਗਿੰਗ ਲਈ, ਤੁਸੀਂ ਤਿੰਨ ਮੁੱਢਲੇ ਚੀਜ਼ਾਂ ਚਾਹੁੰਦੇ ਹੋ: ਸਕ੍ਰਿਪਟ ਫਾਈਲਾਂ ਵਿੱਚ ਬ੍ਰੇਕਪੌਇੰਟ ਸੈੱਟ ਕਰਨਾ, ਲਾਈਨ-ਬਾਈ-ਲਾਈਨ ਸਟੀਪ ਕਰਨਾ, ਅਤੇ ਵੇਰੀਏਬਲਾਂ ਨੂੰ ਵੇਖਨਾ ਜਦ ਉਹ ਬਦਲਦੀਆਂ ਹਨ। ਬਹੁਤ ਸਾਰੇ ਸਟੂਡੀਓ ਇਸਨੂੰ Lua ਦੇ debug hooks ਨੂੰ ਇੱਕ ਐਡੀਟਰ UI ਨਾਲ ਇਕਾਈਕਰਨ ਕਰਕੇ ਜਾਂ ਇੱਕ ਤਿਆਰ ਰਿਮੋਟ ਡਿਬੱਗਰ ਨਾਲ ਅੰਤਰਗਤ ਕਰੋ।
ਪੂਰੇ ਡਿਬੱਗਰ ਦੇ ਬਿਨਾਂ ਵੀ, ਵਿਕਾਸਕਾਰਾਂ ਲਈ ਸੁਵਿਧਾਵਾਂ ਜੋੜੋ:
ਸਕ੍ਰਿਪਟ ਪ੍ਰਦਰਸ਼ਨ ਸਮੱਸਿਆਵਾਂ ਆਮ ਤੌਰ 'ਤੇ "Lua ਹੌਲੀ ਹੈ" ਵਾਲੀਆਂ ਨਹੀਂ ਹੁੰਦੀਆਂ; ਉਹ ਆਮ ਤੌਰ 'ਤੇ ਹੁੰਦੀਆਂ ਹਨ "ਇਹ ਫੰਕਸ਼ਨ ਹਰ ਫਰੇਮ 10,000 ਵਾਰੀ ਚਲ ਰਿਹਾ ਹੈ"। ਸਕ੍ਰਿਪਟ ਐਂਟਰੀ ਪੁਆਇੰਟਸ (AI ਟਿਕਸ, UI ਅਪਡੇਟ, ਇਵੈਂਟ ਹੈਂਡਲਰ) ਦੇ ਆਲੇ-ਦੁਆਲੇ ਹਲਕੇ ਕਾਊਂਟਰ ਅਤੇ ਟਾਈਮਰ ਜੋੜੋ, ਫਿਰ ਫੰਕਸ਼ਨ ਨਾਂ ਦੇ ਨਾਲ ਇਕੱਠਾ ਕਰੋ।
ਜਦ ਤੁਸੀਂ ਇੱਕ ਹਾਟਸਪਾਟ ਲੱਭ ਲੈਂਦੇ ਹੋ, ਫੈਸਲਾ ਕਰੋ ਕਿ:
ਸਕ੍ਰਿਪਟਾਂ ਨੂੰ ਕੋਡ ਵਾਂਗ behandelt ਕਰੋ। ਪਿਊਰ Lua ਮੋਡੀਊਲਜ਼ ਲਈ ਯੂਨਿਟ ਟੈਸਟ ਚਲਾਓ (ਗੇਮ ਨਿਯਮ, ਗਣਿਤ, ਲੁੱਟ ਟੇਬਲ), ਨਾਲ ਹੀ ਇੰਟਿਗ੍ਰੇਸ਼ਨ ਟੈਸਟ ਜੋ ਇੱਕ ਘੱਟੋ-ਘੱਟ ਗੇਮ ਰਨਟਾਈਮ ਬੂਟ ਕਰਕੇ ਮੁੱਖ ਫਲੋਜ਼ ਚਲਾਉਂਦੇ ਹਨ।
ਬਿਲਡਾਂ ਲਈ, ਸਕ੍ਰਿਪਟਾਂ ਨੂੰ ਇਕ ਨਿਯਮਤ ਢੰਗ ਨਾਲ ਪੈਕੇਜ ਕਰੋ: ਸਧਾਰਨ ਫਾਇਲਾਂ (ਆਸਾਨ ਪੈਚਿੰਗ) ਜਾਂ ਇੱਕ ਬੰਨਲਡ ਆਰਕਾਈਵ (ਘੱਟ ਖੁੱਲ੍ਹੇ ਐਸੈਟ)। ਜੋ ਵੀ ਤੁਹਾਨੂੰ ਚੁਣਨਾ ਹੈ, build ਸਮੇਂ ਸੈਧ ਕਰੋ: syntax check, ਲਾਜ਼ਮੀ ਮੋਡੀਊਲ ਮੌਜੂਦਗੀ, ਅਤੇ ਇੱਕ ਸਧਾਰਣ "ਸਭ ਸਕ੍ਰਿਪਟ ਲੋਡ ਕਰੋ" smoke test ਤਾ ਕਿ ਖ਼ਰਾਬ ਆਸੈਟਸ ਸ਼ਿਪਿੰਗ ਤੌਂ ਪਹਿਲਾਂ ਪਕੜੇ ਜਾਣ।
ਜੇ ਤੁਸੀਂ ਸਕ੍ਰਿਪਟਾਂ 'ਤੇ ਆਧਾਰਿਤ ਅੰਦਰੂਨੀ ਟੂਲ—ਜਿਵੇਂ ਇੱਕ ਵੈੱਬ-ਅਧਾਰਿਤ "ਸਕ੍ਰਿਪਟ ਰਜਿਸਟਰੀ", ਪ੍ਰੋਫਾਈਲਿੰਗ ਡੈਸ਼ਬੋਰਡ, ਜਾਂ ਇੱਕ ਕਨਟੈਂਟ ਵੈਧਤਾ ਸੇਵਾ—ਬਣਾ ਰਹੇ ਹੋ, ਤਾਂ Koder.ai ਛੇਤੀ ਪ੍ਰੋਟੋਟਾਈਪ ਅਤੇ ਉਹਨਾਂ ਸਾਥੀ ਐਪਸ ਨੂੰ ਸ਼ਿਪ ਕਰਨ ਲਈ ਮਦਦਗਾਰ ਹੋ ਸਕਦਾ ਹੈ। ਕਿਉਂਕਿ ਇਹ ਚੈਟ ਰਾਹੀਂ ਫੁੱਲ-ਸਟੈਕ ਐਪਲੀਕੇਸ਼ਨ ਜਨਰੇਟ ਕਰਦਾ ਹੈ (ਆਮ ਤੌਰ 'ਤੇ React + Go + PostgreSQL) ਅਤੇ ਡਿਪਲੋਇਮੈਂਟ, ਹੋਸਟਿੰਗ ਅਤੇ snapshots/rollback ਸਹਾਇਤਾ ਦਿੰਦਾ ਹੈ, ਇਹ ਸਟੂਡੀਓ ਟੂਲਿੰਗ ਤੇਜ਼ੀ ਨਾਲ ਬਣਾਉਣ ਲਈ ਉਚਿਤ ਹੈ ਬਿਨਾਂ ਮਹੀਨਿਆਂ ਦੀ ਇੰਜੀਨੀਅਰਿੰਗ ਮਹਨਤ ਦੇ।
ਸਕ੍ਰਿਪਟਿੰਗ ਭਾਸ਼ਾ ਚੁਣਨਾ "ਸਾਰਥਕ ਸਭ ਤੋਂ ਵਧੀਆ" ਬਾਰੇ ਨਹੀਂ ਹੁੰਦਾ, ਸਗੋਂ ਇਸ ਬਾਰੇ ਹੁੰਦਾ ਹੈ ਕਿ ਕਿਹੜਾ ਤੁਹਾਡੇ ਇੰਜਣ, ਡਿਪਲੋਇਮੈਂਟ ਟਾਰਗੇਟ ਅਤੇ ਟੀਮ ਲਈ ਫਿੱਟ ਹੁੰਦਾ ਹੈ। ਜੇ ਤੁਸੀਂ ਇੱਕ ਹਲਕਾ, ਪਰਯਾਪਤ ਤੇਜ਼ ਸਕ੍ਰਿਪਟ ਲੇਅਰ ਚਾਹੁੰਦੇ ਹੋ ਜੋ ਇੰਬੈੱਡ ਕਰਨਾ ਆਸਾਨ ਹੋਵੇ, ਤਾਂ Lua ਅਕਸਰ ਜਿੱਤਦਾ ਹੈ।
Python ਟੂਲਜ਼ ਅਤੇ ਪਾਈਪਲਾਈਨ ਲਈ ਬਹੁਤ ਵਧੀਆ ਹੈ, ਪਰ ਇਹ ਗੇਮ ਵਿੱਚ ਸ਼ਿਪ ਕਰਨ ਲਈ ਇਕ ਭਾਰੀ ਰਨਟਾਈਮ ਹੈ। Python ਨੂੰ ਇੰਬੈੱਡ ਕਰਨਾ ਵੀ ਜ਼ਿਆਦਾ ਡਿਪੈਂਡੈਂਸੀ ਖਿਚ ਸਕਦਾ ਹੈ ਅਤੇ ਇਸਦੀ ਇਨਟੀਗ੍ਰੇਸ਼ਨ ਸਰਫੇਸ ਹੋਰ ਜਟਿਲ ਹੋ ਸਕਦੀ ਹੈ。
Lua, ਇਸਦੇ ਬਰਕਸ, ਆਮ ਤੌਰ 'ਤੇ ਮੈਮੋਰੀ ਫੁੱਟਪ੍ਰਿੰਟ ਵਿੱਚ ਕਾਫ਼ੀ ਘੱਟ ਹੈ ਅਤੇ ਹਰ ਪਲੇਟਫਾਰਮ 'ਤੇ ਬੰਡਲ ਕਰਨਾ ਆਸਾਨ ਹੈ। ਇਹਦਾ C API ਪਹਿਲੇ ਦਿਨ ਤੋਂ ਇੰਬੈੱਡਿੰਗ ਲਈ ਡਿਜ਼ਾਇਨ ਕੀਤਾ ਗਿਆ ਸੀ, ਜੋ ਅਕਸਰ ਇੰਜਣ ਕੋਡ (ਅਤੇ ਉਲਟ) ਨੂੰ ਕਾਲ ਕਰਨ ਨੂੰ ਸੋਚਣਯੋਗ ਬਣਾ ਦਿੰਦਾ ਹੈ।
ਰੇਟ ਤੇ: Python ਉੱਚ-ਸਤਹ ਲੋਜਿਕ ਲਈ ਕਾਫੀ ਤੇਜ਼ ਹੋ ਸਕਦੀ ਹੈ, ਪਰ ਜਦ ਸਕ੍ਰਿਪਟ ਅਕਸਰ ਚਲਦੇ ਹਨ (AI ਟਿਕਸ, ਅਬਿਲਿਟੀ ਲੋਜਿਕ, UI ਅਪਡੇਟ), ਤਾਂ Lua ਦਾ ਐਗਜ਼ਿਕਿਊਸ਼ਨ ਮਾਡਲ ਅਤੇ ਆਮ ਵਰਤੋਂ ਲਈਜ਼ ਪੈਟਰਨ ਅਕਸਰ ਵਧੀਆ ਫਿੱਟ ਹੁੰਦੇ ਹਨ।
JavaScript ਆਕਰਸ਼ਕ ਹੋ ਸਕਦਾ ਹੈ ਕਿਉਂਕਿ ਬਹੁਤ ਸਾਰੇ ਡਿਵੈਲਪਰ ਪਹਿਲਾਂ ਹੀ ਇਸਨੂੰ ਜਾਣਦੇ ਹਨ, ਅਤੇ ਆਧੁਨਿਕ JS ਇੰਜਨਾਂ ਬਹੁਤ ਤੇਜ਼ ਹਨ। ਵਪਾਰ-ਬਦਲਾਵ ਇਹ ਹੈ ਕਿ ਰਨਟਾਈਮ ਦਾ ਭਾਰ ਅਤੇ ਇੰਟੀਗ੍ਰੇਸ਼ਨ ਜਟਿਲਤਾ: ਇੱਕ ਪੂਰਾ JS ਇੰਜਨ ਸ਼ਿਪ ਕਰਨਾ ਵੱਡਾ ਬਦਲाव ਹੋ ਸਕਦਾ ਹੈ, ਅਤੇ ਬਾਈਂਡਿੰਗ ਲੇਅਰ ਖੁਦ ਇੱਕ ਪ੍ਰੋਜੈਕਟ ਬਣ ਸਕਦੀ ਹੈ।
Lua ਦਾ ਰਨਟਾਈਮ ਕਾਫੀ ਹਲਕਾ ਹੈ, ਅਤੇ ਇਸਦੀ ਇੰਬੈੱਡਿੰਗ ਕਹਾਣੀ ਆਮ ਤੌਰ 'ਤੇ ਗੇਮ-ਇੰਜਣ ਅਨੁਕੂਲ ਹੋਸਟ ਐਪਲੀਕੇਸ਼ਨਾਂ ਲਈ ਜ਼ਿਆਦਾ ਪੇਸ਼ਗੀਯੋਗ ਹੁੰਦੀ ਹੈ।
C# ਉਤਪਾਦਕ ਵਰਕਫਲੋ, ਵਧੀਆ ਟੂਲਿੰਗ, ਅਤੇ ਜਾਣੇ-ਪਛਾਣੇ object-oriented ਮਾਡਲ ਦਿੰਦਾ ਹੈ। ਜੇ ਤੁਹਾਡਾ ਇੰਜਣ ਪਹਿਲਾਂ ਹੀ managed runtime ਹੋਸਟ ਕਰਦਾ ਹੈ, iteration ਗਤੀ ਅਤੇ ਡਿਵੈਲਪਰ ਅਨੁਭਵ ਸ਼ਾਨਦਾਰ ਹੋ ਸਕਦੇ ਹਨ।
ਪਰ ਜੇ ਤੁਸੀਂ ਇੱਕ ਕਸਟਮ ਇੰਜਣ ਬਣਾ ਰਹੇ ਹੋ (ਖਾਸ ਕਰਕੇ ਸੰਕੁਚਿਤ ਪਲੇਟਫਾਰਮਾਂ ਲਈ), ਇੱਕ managed runtime ਹੋਸਟ ਕਰਨ ਨਾਲ ਬਾਇਨਰੀ ਆਕਾਰ, ਮੈਮੋਰੀ ਵਰਤੋਂ, ਅਤੇ startup ਲਾਗਤ ਵੱਧ ਸਕਦੀ ਹੈ। Lua ਅਕਸਰ ਛੋਟੀ ਰਨਟਾਈਮ ਫੁੱਟਪ੍ਰਿੰਟ ਨਾਲ ਠੀਕ-ਠਾਕ ਵਰਕਫਲੋ ਦਿੰਦਾ ਹੈ।
ਜੇ ਤੁਹਾਡੇ ਪਾਬੰਦੀਆਂ ਤੰਗ ਹਨ (ਮੋਬਾਈਲ, ਕਨਸੋਲ, ਕਸਟਮ ਇੰਜਣ), ਅਤੇ ਤੁਸੀਂ ਇੱਕ ਇੰਬੈੱਡ ਕੀਤੀ ਹੋਈ ਸਕ੍ਰਿਪਟਿੰਗ ਭਾਸ਼ਾ ਚਾਹੁੰਦੇ ਹੋ ਜੋ ਆਪਣੇ ਆਪ ਨੂੰ ਰਾਹ ਵਿੱਚ ਨਾ ਰੱਖੇ, ਤਾਂ Lua ਮੁਸ਼ਕਲ ਨਾਲ ਹਰਾ ਸਕਦਾ ਹੈ। ਜੇ ਤੁਹਾਡੀ ਤਰਜੀਹ developer ਜਾਣ-ਪਛਾਣ ਹੈ ਜਾਂ ਤੁਸੀਂ ਪਹਿਲਾਂ ਹੀ ਕਿਸੇ ਖਾਸ ਰਨਟਾਈਮ (JS ਜਾਂ .NET) 'ਤੇ ਨਿਰਭਰ ਹੋ, ਤਾਂ ਟੀਮ ਦੀ ਤਾਕਤਾਂ ਨਾਲ ਮਿਲਣਾ Lua ਦੇ ਫੁੱਟਪ੍ਰਿੰਟ ਅਤੇ ਇੰਬੈੱਡਿੰਗ ਫਾਇਦਿਆਂ ਤੋਂ ਜ਼ਿਆਦਾ ਹੋ ਸਕਦਾ ਹੈ।
Lua ਨੂੰ ਸਭ ਤੋਂ ਵਧੀਆ ਤਰੀਕੇ ਨਾਲ ਜੋੜਨਾ ਉਸ ਵੇਲੇ ਹੁੰਦਾ ਹੈ ਜਦ ਤੁਸੀਂ ਇਸਨੂੰ ਆਪਣੇ ਇੰਜਣ ਅੰਦਰ ਇੱਕ ਉਤਪਾਦ ਵਜੋਂ ਇਲਾਜ ਕਰੋ: ਇੱਕ ਸਥਿਰ ਇੰਟਰਫੇਸ, ਪੇਸ਼ਗੀਯੋਗ ਵਿਹਾਰ, ਅਤੇ ਉਹ ਗਾਰਡਰੇਲ ਜੋ ਕੰਟੈਂਟ ਬਨਾਉਣ ਵਾਲਿਆਂ ਨੂੰ ਪ੍ਰਭਾਵਸ਼ালী ਬਣਾਉਣ।
ਕੱਚੇ ਇੰਜਣ ਇੰਟਰਨਲਜ਼ ਦੀ ਥਾਂ ਇੱਕ ਛੋਟਾ ਸੇਟ ਇੰਜਣ ਸੇਵਾਵਾਂ ਐਕਸਪੋਜ਼ ਕਰੋ। ਆਮ ਸੇਵਾਵਾਂ ਵਿੱਚ time, input, audio, UI, spawning, ਅਤੇ logging ਸ਼ਾਮਿਲ ਹਨ। ਇੱਕ event system ਜੋ ਸਕ੍ਰਿਪਟਸ ਨੂੰ ਗੇਮਪਲੇ ਨੂੰ ਪ੍ਰਤੀਕਿਰਿਆ ਕਰਨ ਦਿੰਦਾ ਹੈ ("OnHit", "OnQuestCompleted") ਤਾਂ ਕਿ ਉਹ constant polling ਦੀ ਥਾਂ event-driven ਰਹਿਣ।
ਡੇਟਾ ਐਕਸੈਸ ਨੂੰ explicit ਰੱਖੋ: configuration ਲਈ read-only view, ਅਤੇ state ছোট-ਲਿਖਤ ਲਈ ਇੱਕ ਨਿਯੰਤਰਿਤ write path। ਇਹ ਟੈਸਟ, ਸੁਰੱਖਿਆ, ਅਤੇ ਵਿਕਾਸ ਲਈ ਆਸਾਨ ਬਣਾਉਂਦਾ ਹੈ।
Lua ਨੂੰ ਨਿਯਮ, ਆਰਕੀਸਟਰ, ਅਤੇ ਕੰਟੈਂਟ ਲੋਜਿਕ ਲਈ ਵਰਤੋਂ; ਭਾਰੀ ਕੰਮ (ਪਾਥਫਾਈਂਡਿੰਗ, ਫਿਜ਼ਿਕਸ ਪ੍ਰਸ਼ਨ, ਐਨੀਮੇਸ਼ਨ ਮੁਲਾਂਕਣ, ਵੱਡੇ ਲੂਪ) natives ਵਿੱਚ ਰੱਖੋ। ਇੱਕ ਚੰਗਾ ਨਿਯਮ: ਜੇ ਇਹ ਹਰ ਫਰੇਮ ਬਹੁਤ ਸਾਰੀਆਂ ਐਨਟੀਟੀਆਂ ਲਈ ਚਲਦਾ ਹੈ, ਤਾਂ ਇਹ ਸੰਭਵত C/C++ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ ਜਿਸਦੇ ਨਾਲ Lua-ਫ੍ਰੈਂਡਲੀ 래પર ਹੋਵੇ।
ਸ਼ੁਰੂ ਵਿੱਚ conventions ਸਥਾਪਤ ਕਰੋ: ਮੋਡੀਊਲ ਲੇਆਉਟ, ਨਾਮਕਰਨ, ਅਤੇ ਵਿਧੀ ਜਿਨ੍ਹਾਂ ਨਾਲ ਸਕ੍ਰਿਪਟ ਅਸਫਲਤਾ ਸਿਗਨਲ ਕਰਦੇ ਹਨ।
ਫੈਸਲਾ ਕਰੋ ਕਿ errors throw ਕਰਨੇ ਹਨ, nil, err ਰਿਟਰਨ ਕਰਨੇ ਹਨ, ਜਾਂ events ਭੇਜਣੇ ਹਨ।
ਲਾਗਿੰਗ ਕੇਂਦਰੀਕ੍ਰਿਤ ਕਰੋ ਅਤੇ stack traces actionable ਬਣਾਓ। ਜਦ ਇੱਕ ਸਕ੍ਰਿਪਟ fail ਕਰੇ, entity ID, level name, ਅਤੇ ਆਖਰੀ ਇਵੈਂਟ ਸ਼ਾਮਿਲ ਕਰੋ।
Localization: strings ਨੂੰ logic ਤੋਂ ਹਟਾਉ ਅਤੇ ਟੈਕਸਟ ਨੂੰ localization ਸੇਵਾ ਰਾਹੀਂ ਰੂਟ ਕਰੋ।
Save/load: ਆਪਣੀ save data ਨੂੰ version ਕਰੋ ਅਤੇ ਸਕ੍ਰਿਪਟ ਸਟੇਟ serializable ਰੱਖੋ (ਟੇਬਲਾਂ ਜੋ ਪ੍ਰਿਮੀਟਿਵਾਂ, stable IDs ਰੱਖਦੀਆਂ ਹਨ)।
Determinism (ਜੇ replays ਜਾਂ netcode ਲਈ ਲੋੜ ਹੋ): nondeterministic ਸਰੋਤ (wall-clock time, unordered iteration) ਤੋਂ ਬਚੋ ਅਤੇ RNG ਦੇ ਵਰਤੇ ਜਾ ਰਹੇ ਹਿੱਸਿਆਂ ਨੂੰ seeded ਰੱਖੋ।
Implementation ਵਿਵਰਣ ਅਤੇ ਪੈਟਰਨਾਂ ਲਈ, ਦੇਖੋ /blog/scripting-apis ਅਤੇ /docs/save-load.
Lua ਆਪਣੀ ਸ਼ੋਹਰਤ ਖੇਡ ਇੰਜਣਾਂ ਵਿੱਚ ਇਸ ਲਈ ਕਮਾਉਂਦਾ ਹੈ ਕਿਉਂਕਿ ਇਹ ਇੰਬੈੱਡ ਕਰਨ ਵਿੱਚ ਸਧਾਰਣ ਹੈ, ਜ਼ਿਆਦਾਤਰ ਗੇਮਪਲੇ ਲੋਜਿਕ ਲਈ ਤੇਜ਼-ਕਾਫ਼ੀ ਹੈ, ਅਤੇ ਡੇਟਾ-ਡ੍ਰਾਈਵਨ ਫੀਚਰਾਂ ਲਈ ਲਚਕੀਲਾ ਹੈ। ਤੁਸੀਂ ਇਸਨੂੰ ਘੱਟ ਓਵਰਹੈੱਡ ਨਾਲ ਸ਼ਿਪ ਕਰ ਸਕਦੇ ਹੋ, ਇਸਨੂੰ ਸਾਫ਼ C/C++ ਨਾਲ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਜੋੜ ਸਕਦੇ ਹੋ, ਅਤੇ ਕੋਰੋਟਾਈਨਾਂ ਨਾਲ ਗੇਮਪਲੇ ਫਲੋ ਨੂੰ ਸੰਰਚਿਤ ਕਰ ਸਕਦੇ ਹੋ ਬਿਨਾਂ ਤੁਹਾਡੇ ਇੰਜਣ ਨੂੰ ਭਾਰੀ ਰਨਟਾਈਮ ਜਾਂ ਜਟਿਲ ਟੂਲਚੇਨ ਵਿੱਚ ਫਸਾਏ।
Use this as a quick evaluation pass:
ਜੇ ਤੁਸੀਂ ਜ਼ਿਆਦਾਤਰ ਸਵਾਲਾਂ ਦੇ “ਹਾਂ” ਦੇ ਉੱਤਰ ਦਿੱਤੇ, ਤਾਂ Lua ਇੱਕ ਮਜ਼ਬੂਤ ਉਮੀਦਵਾਰ ਹੈ।
wait(seconds), wait_event(name)) ਅਤੇ ਇਸਨੂੰ ਆਪਣੇ ਮੈਨ ਲੂਪ ਨਾਲ ਇਨਟੈਗਰੇਟ ਕਰੋ।ਜੇ ਤੁਸੀਂ ਇੱਕ ਪ੍ਰਯੋਗਿਕ ਸ਼ੁਰੂਆਤ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਦੇਖੋ /blog/best-practices-embedding-lua ਲਈ ਇੱਕ ਘੱਟੋ-ਘੱਟ ਇੰਬੈੱਡਿੰਗ ਚੈੱਕਲਿਸਟ ਜੋ ਤੁਸੀਂ ਅਨੁਕੂਲ ਕਰ ਸਕਦੇ ਹੋ।
Embedding means your application includes the Lua runtime and drives it.
Standalone scripting runs scripts in an external interpreter/tool (e.g., from a terminal), and your app is just a consumer of outputs.
Embedded scripting flips the relationship: the game is the host, and scripts execute inside the game’s process with game-owned timing, memory rules, and exposed APIs.
Lua is often chosen because it fits shipping constraints:
Typical wins are iteration speed and separation of concerns:
Keep scripts orchestrating and keep heavy kernels native.
Good Lua use cases:
Avoid putting these in Lua hot loops:
A few practical habits help avoid frame-time spikes:
Most integrations are stack-based:
For Lua → engine calls, you expose curated C/C++ functions (often grouped into a module table like engine.audio.play(...)).
Coroutines let scripts pause/resume cooperatively without blocking the game loop.
Common pattern:
wait_seconds(t) / wait_event(name)This keeps quest/cutscene logic readable without sprawling state flags.
Start from a minimal environment and add capabilities intentionally:
Treat the Lua-facing API like a stable product interface:
API_VERSION helps)ioosloadfile (and restrict load) to prevent arbitrary code injectiongame/engine) instead of full globals