unit_interaction.html 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. <!DOCTYPE html>
  2. <html class="writer-html5" lang="en" >
  3. <head>
  4. <meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
  5. <meta property="article:modified_time" content="2025-10-16T08:33:32+00:00" /><meta property="og:title" content="Interacting with Units" />
  6. <meta property="og:type" content="website" />
  7. <meta property="og:url" content="https://docs.crownengine.org/html/latest/gameplay/unit_interaction.html" />
  8. <meta property="og:site_name" content="Crown 0.60.0 Manual" />
  9. <meta property="og:description" content="At some point you will probably need to reference units from the Lua scripts to manipulate their properties, be notified of particular events and make them do something interesting. Getting Unit handles: The simplest way of getting a handle to a unit is to spawn it directly fr..." />
  10. <meta name="description" content="At some point you will probably need to reference units from the Lua scripts to manipulate their properties, be notified of particular events and make them do something interesting. Getting Unit handles: The simplest way of getting a handle to a unit is to spawn it directly fr..." />
  11. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  12. <title>Interacting with Units &mdash; Crown 0.60.0 Manual 0.61.0 documentation</title>
  13. <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
  14. <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
  15. <link rel="stylesheet" href="../_static/css/custom.css" type="text/css" />
  16. <link rel="shortcut icon" href="../_static/org.crownengine.Crown.svg"/>
  17. <link rel="canonical" href="https://docs.crownengine.org/html/latest/gameplay/unit_interaction.html" />
  18. <!--[if lt IE 9]>
  19. <script src="../_static/js/html5shiv.min.js"></script>
  20. <![endif]-->
  21. <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
  22. <script src="../_static/jquery.js"></script>
  23. <script src="../_static/underscore.js"></script>
  24. <script src="../_static/doctools.js"></script>
  25. <script src="../_static/js/theme.js"></script>
  26. <link rel="index" title="Index" href="../genindex.html" />
  27. <link rel="search" title="Search" href="../search.html" />
  28. <link rel="copyright" title="Copyright" href="../copyright.html" />
  29. <link rel="next" title="Deploying" href="../deploying/index.html" />
  30. <link rel="prev" title="Objects binding and lifetime" href="objects_binding.html" />
  31. </head>
  32. <body class="wy-body-for-nav">
  33. <div class="wy-grid-for-nav">
  34. <nav data-toggle="wy-nav-shift" class="wy-nav-side">
  35. <div class="wy-side-scroll">
  36. <div class="wy-side-nav-search" >
  37. <a href="../index.html">
  38. <img src="../_static/org.crownengine.Crown.svg" class="logo" alt="Logo"/>
  39. </a>
  40. <div class="version">
  41. Crown 0.60.0 Manual
  42. </div>
  43. <div role="search">
  44. <form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
  45. <input type="text" name="q" placeholder="Search docs" />
  46. <input type="hidden" name="check_keywords" value="yes" />
  47. <input type="hidden" name="area" value="default" />
  48. </form>
  49. </div>
  50. </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
  51. <ul class="current">
  52. <li class="toctree-l1"><a class="reference internal" href="../changelog.html">Changelog</a></li>
  53. <li class="toctree-l1"><a class="reference internal" href="../introduction.html">Introduction</a></li>
  54. <li class="toctree-l1"><a class="reference internal" href="../installing_crown/index.html">Installing Crown</a></li>
  55. <li class="toctree-l1"><a class="reference internal" href="../getting_started/index.html">Getting Started</a></li>
  56. <li class="toctree-l1"><a class="reference internal" href="../importing_resources/index.html">Importing Resources</a></li>
  57. <li class="toctree-l1 current"><a class="reference internal" href="index.html">Writing Gameplay</a><ul class="current">
  58. <li class="toctree-l2"><a class="reference internal" href="lua_scripting.html">Scripting in Lua</a></li>
  59. <li class="toctree-l2"><a class="reference internal" href="objects_binding.html">Objects binding and lifetime</a></li>
  60. <li class="toctree-l2 current"><a class="current reference internal" href="#">Interacting with Units</a><ul>
  61. <li class="toctree-l3"><a class="reference internal" href="#getting-unit-handles">Getting Unit handles</a></li>
  62. <li class="toctree-l3"><a class="reference internal" href="#the-script-component">The Script component</a></li>
  63. <li class="toctree-l3"><a class="reference internal" href="#creating-a-unit-script">Creating a Unit script</a></li>
  64. <li class="toctree-l3"><a class="reference internal" href="#receiving-collision-events">Receiving collision events</a></li>
  65. <li class="toctree-l3"><a class="reference internal" href="#triggers">Triggers</a></li>
  66. </ul>
  67. </li>
  68. </ul>
  69. </li>
  70. <li class="toctree-l1"><a class="reference internal" href="../deploying/index.html">Deploying</a></li>
  71. <li class="toctree-l1"><a class="reference internal" href="../reference/index.html">Reference</a></li>
  72. <li class="toctree-l1"><a class="reference internal" href="../lua_api.html">Lua API reference</a></li>
  73. <li class="toctree-l1"><a class="reference internal" href="../glossary.html">Glossary</a></li>
  74. <li class="toctree-l1"><a class="reference internal" href="../copyright.html">License</a></li>
  75. <li class="toctree-l1"><a class="reference internal" href="../hackers/index.html">Hackers</a></li>
  76. </ul>
  77. </div>
  78. </div>
  79. </nav>
  80. <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
  81. <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
  82. <a href="../index.html">Crown 0.60.0 Manual</a>
  83. </nav>
  84. <div class="wy-nav-content">
  85. <div class="rst-content">
  86. <div role="navigation" aria-label="Page navigation">
  87. <ul class="wy-breadcrumbs">
  88. <li><a href="../index.html" class="icon icon-home"></a> &raquo;</li>
  89. <li><a href="index.html">Writing Gameplay</a> &raquo;</li>
  90. <li>Interacting with Units</li>
  91. <li class="wy-breadcrumbs-aside">
  92. <a href="../_sources/gameplay/unit_interaction.rst.txt" rel="nofollow"> View page source</a>
  93. </li>
  94. </ul>
  95. <hr/>
  96. </div>
  97. <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
  98. <div itemprop="articleBody">
  99. <section id="interacting-with-units">
  100. <h1>Interacting with Units<a class="headerlink" href="#interacting-with-units" title="Permalink to this headline">¶</a></h1>
  101. <p>At some point you will probably need to reference units from the Lua scripts to
  102. manipulate their properties, be notified of particular events and make them do
  103. something interesting.</p>
  104. <section id="getting-unit-handles">
  105. <h2>Getting Unit handles<a class="headerlink" href="#getting-unit-handles" title="Permalink to this headline">¶</a></h2>
  106. <p>The simplest way of getting a handle to a unit is to spawn it directly from a
  107. script:</p>
  108. <div class="highlight-lua notranslate"><div class="highlight"><pre><span></span><span class="n">player</span> <span class="o">=</span> <span class="n">World</span><span class="p">.</span><span class="n">spawn_unit</span><span class="p">(</span><span class="n">world</span><span class="p">,</span> <span class="s2">&quot;units/player/player&quot;</span><span class="p">)</span>
  109. </pre></div>
  110. </div>
  111. <p>In most cases, however, units are not spawned directly but rather as a
  112. consequence of loading levels in a world. You can get a table with all units
  113. spawned in a world this way:</p>
  114. <div class="highlight-lua notranslate"><div class="highlight"><pre><span></span><span class="kd">local</span> <span class="n">units</span> <span class="o">=</span> <span class="n">World</span><span class="p">.</span><span class="n">units</span><span class="p">(</span><span class="n">world</span><span class="p">)</span>
  115. <span class="kr">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">u</span> <span class="kr">in</span> <span class="nb">ipairs</span><span class="p">(</span><span class="n">units</span><span class="p">)</span> <span class="kr">do</span>
  116. <span class="c1">-- Do something with Unit u.</span>
  117. <span class="kr">end</span>
  118. </pre></div>
  119. </div>
  120. <p>To obtain a specific Unit by name (its name as set in the Level Editor, <em>not</em>
  121. the unit name itself):</p>
  122. <div class="highlight-lua notranslate"><div class="highlight"><pre><span></span><span class="n">door</span> <span class="o">=</span> <span class="n">World</span><span class="p">.</span><span class="n">unit_by_name</span><span class="p">(</span><span class="n">world</span><span class="p">,</span> <span class="s2">&quot;main_door&quot;</span><span class="p">)</span>
  123. </pre></div>
  124. </div>
  125. </section>
  126. <section id="the-script-component">
  127. <h2>The Script component<a class="headerlink" href="#the-script-component" title="Permalink to this headline">¶</a></h2>
  128. <p>Obtaining unit handles is useful but might not be enough. With a unit handle
  129. alone you can modify properties but you cannot receive events.</p>
  130. </section>
  131. <section id="creating-a-unit-script">
  132. <h2>Creating a Unit script<a class="headerlink" href="#creating-a-unit-script" title="Permalink to this headline">¶</a></h2>
  133. <p>Unit scripts are a particular type of scripts that can be attached to units via
  134. a Script Component. To create a Unit script, right click on the Project Browser
  135. and choose <code class="docutils literal notranslate"><span class="pre">New</span> <span class="pre">(Unit)</span> <span class="pre">script</span></code>.</p>
  136. <p>Crown will create a new Unit script similar to the following:</p>
  137. <div class="highlight-lua notranslate"><div class="highlight"><pre><span></span><span class="n">MyScript</span> <span class="o">=</span> <span class="n">MyScript</span> <span class="ow">or</span> <span class="p">{</span>
  138. <span class="n">data</span> <span class="o">=</span> <span class="p">{}</span>
  139. <span class="p">}</span>
  140. <span class="kd">local</span> <span class="n">data</span> <span class="o">=</span> <span class="n">MyScript</span><span class="p">.</span><span class="n">data</span>
  141. <span class="c1">-- Called after units are spawned into a world.</span>
  142. <span class="kr">function</span> <span class="nc">MyScript</span><span class="p">.</span><span class="nf">spawned</span><span class="p">(</span><span class="n">world</span><span class="p">,</span> <span class="n">units</span><span class="p">)</span>
  143. <span class="kr">if</span> <span class="n">data</span><span class="p">[</span><span class="n">world</span><span class="p">]</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span>
  144. <span class="n">data</span><span class="p">[</span><span class="n">world</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
  145. <span class="kr">end</span>
  146. <span class="kd">local</span> <span class="n">world_data</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">world</span><span class="p">]</span>
  147. <span class="kr">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">unit</span> <span class="kr">in</span> <span class="nb">pairs</span><span class="p">(</span><span class="n">units</span><span class="p">)</span> <span class="kr">do</span>
  148. <span class="c1">-- Store instance-specific data.</span>
  149. <span class="kr">if</span> <span class="n">world_data</span><span class="p">[</span><span class="n">unit</span><span class="p">]</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span>
  150. <span class="n">world_data</span><span class="p">[</span><span class="n">unit</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
  151. <span class="kr">end</span>
  152. <span class="kr">end</span>
  153. <span class="kr">end</span>
  154. <span class="c1">-- Called once per frame.</span>
  155. <span class="kr">function</span> <span class="nc">MyScript</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">world</span><span class="p">,</span> <span class="n">dt</span><span class="p">)</span>
  156. <span class="kd">local</span> <span class="n">world_data</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">world</span><span class="p">]</span>
  157. <span class="kr">for</span> <span class="n">unit</span><span class="p">,</span> <span class="n">unit_data</span> <span class="kr">in</span> <span class="nb">pairs</span><span class="p">(</span><span class="n">world_data</span><span class="p">)</span> <span class="kr">do</span>
  158. <span class="c1">-- Update unit.</span>
  159. <span class="kr">end</span>
  160. <span class="kr">end</span>
  161. <span class="c1">-- Called before units are unspawned from a world.</span>
  162. <span class="kr">function</span> <span class="nc">MyScript</span><span class="p">.</span><span class="nf">unspawned</span><span class="p">(</span><span class="n">world</span><span class="p">,</span> <span class="n">units</span><span class="p">)</span>
  163. <span class="kd">local</span> <span class="n">world_data</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">world</span><span class="p">]</span>
  164. <span class="c1">-- Cleanup.</span>
  165. <span class="kr">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">unit</span> <span class="kr">in</span> <span class="nb">pairs</span><span class="p">(</span><span class="n">units</span><span class="p">)</span> <span class="kr">do</span>
  166. <span class="kr">if</span> <span class="n">world_data</span><span class="p">[</span><span class="n">unit</span><span class="p">]</span> <span class="kr">then</span>
  167. <span class="n">world_data</span><span class="p">[</span><span class="n">unit</span><span class="p">]</span> <span class="o">=</span> <span class="kc">nil</span>
  168. <span class="kr">end</span>
  169. <span class="kr">end</span>
  170. <span class="kr">end</span>
  171. <span class="kr">return</span> <span class="n">MyScript</span>
  172. </pre></div>
  173. </div>
  174. <p>Unit scripts work differently than similar solutions in other engines. Instead
  175. of getting many individual update() calls for each individual Unit, you will
  176. receive a single update() for <em>every</em> unit that has that particular script
  177. attached to it.</p>
  178. <p>This allows for efficient bulk updates, state sharing and it also make profiling
  179. code easier.</p>
  180. </section>
  181. <section id="receiving-collision-events">
  182. <h2>Receiving collision events<a class="headerlink" href="#receiving-collision-events" title="Permalink to this headline">¶</a></h2>
  183. <p>To get physics collision notification events, implement any of the following
  184. callbacks in your script component:</p>
  185. <div class="highlight-lua notranslate"><div class="highlight"><pre><span></span><span class="kr">function</span> <span class="nc">MyScript</span><span class="p">.</span><span class="nf">collision_begin</span><span class="p">(</span><span class="n">world</span><span class="p">,</span> <span class="n">unit</span><span class="p">,</span> <span class="n">other_unit</span><span class="p">,</span> <span class="n">actor</span><span class="p">,</span> <span class="n">other_actor</span><span class="p">,</span> <span class="n">position</span><span class="p">,</span> <span class="n">normal</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
  186. <span class="c1">-- Called when unit and other_unit begin touching.</span>
  187. <span class="kr">end</span>
  188. <span class="kr">function</span> <span class="nc">MyScript</span><span class="p">.</span><span class="nf">collision_end</span><span class="p">(</span><span class="n">world</span><span class="p">,</span> <span class="n">unit</span><span class="p">,</span> <span class="n">other_unit</span><span class="p">)</span>
  189. <span class="c1">-- Called when unit and other_unit end touching.</span>
  190. <span class="kr">end</span>
  191. <span class="kr">function</span> <span class="nc">MyScript</span><span class="p">.</span><span class="nf">collision_stay</span><span class="p">(</span><span class="n">world</span><span class="p">,</span> <span class="n">unit</span><span class="p">,</span> <span class="n">other_unit</span><span class="p">,</span> <span class="n">actor</span><span class="p">,</span> <span class="n">other_actor</span><span class="p">,</span> <span class="n">position</span><span class="p">,</span> <span class="n">normal</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
  192. <span class="c1">-- Called between collision_begin() and collision_end() while the units remain touching.</span>
  193. <span class="kr">end</span>
  194. </pre></div>
  195. </div>
  196. </section>
  197. <section id="triggers">
  198. <h2>Triggers<a class="headerlink" href="#triggers" title="Permalink to this headline">¶</a></h2>
  199. <p>Units whose actor is configured as a trigger (actor class ‘trigger’) will not
  200. receive regular collision events, instead, they will receive trigger events:</p>
  201. <div class="highlight-lua notranslate"><div class="highlight"><pre><span></span><span class="kr">function</span> <span class="nc">MyScript</span><span class="p">.</span><span class="nf">trigger_enter</span><span class="p">(</span><span class="n">world</span><span class="p">,</span> <span class="n">trigger_unit</span><span class="p">,</span> <span class="n">other_unit</span><span class="p">)</span>
  202. <span class="c1">-- Called when other_unit begins touching trigger_unit.</span>
  203. <span class="kr">end</span>
  204. <span class="kr">function</span> <span class="nc">MyScript</span><span class="p">.</span><span class="nf">trigger_leave</span><span class="p">(</span><span class="n">world</span><span class="p">,</span> <span class="n">trigger_unit</span><span class="p">,</span> <span class="n">other_unit</span><span class="p">)</span>
  205. <span class="c1">-- Called when other_unit ends touching trigger_unit.</span>
  206. <span class="kr">end</span>
  207. </pre></div>
  208. </div>
  209. </section>
  210. </section>
  211. </div>
  212. </div>
  213. <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
  214. <a href="objects_binding.html" class="btn btn-neutral float-left" title="Objects binding and lifetime" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
  215. <a href="../deploying/index.html" class="btn btn-neutral float-right" title="Deploying" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
  216. </div>
  217. <hr/>
  218. <div role="contentinfo">
  219. <p>&#169; <a href="../copyright.html">Copyright</a> Except where otherwise noted, content on this page is licensed under a CC-BY-SA 4.0 Int. License.
  220. <span class="lastupdated">Last updated on Oct 16, 2025.
  221. </span></p>
  222. </div>
  223. Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
  224. <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
  225. provided by <a href="https://readthedocs.org">Read the Docs</a>.
  226. </footer>
  227. </div>
  228. </div>
  229. </section>
  230. </div>
  231. <script>
  232. jQuery(function () {
  233. SphinxRtdTheme.Navigation.enable(true);
  234. });
  235. </script>
  236. <!-- Theme Analytics -->
  237. <script async src="https://www.googletagmanager.com/gtag/js?id=G-XNVGCMNDZH"></script>
  238. <script>
  239. window.dataLayer = window.dataLayer || [];
  240. function gtag(){dataLayer.push(arguments);}
  241. gtag('js', new Date());
  242. gtag('config', 'G-XNVGCMNDZH', {
  243. 'anonymize_ip': true,
  244. });
  245. </script>
  246. </body>
  247. </html>