From 21e11cc16132f64125140a4e4a77847849849f46 Mon Sep 17 00:00:00 2001 From: XuuXiao <126674348+XuuXiao@users.noreply.github.com> Date: Thu, 14 Mar 2024 04:35:06 +0000 Subject: [PATCH 01/14] Update unity-project.md --- .../lethallib/custom-enemies/unity-project.md | 113 +++++++++++++----- 1 file changed, 81 insertions(+), 32 deletions(-) diff --git a/docs/dev/apis/lethallib/custom-enemies/unity-project.md b/docs/dev/apis/lethallib/custom-enemies/unity-project.md index ebaf6fb785a..18066d6e60d 100644 --- a/docs/dev/apis/lethallib/custom-enemies/unity-project.md +++ b/docs/dev/apis/lethallib/custom-enemies/unity-project.md @@ -3,7 +3,7 @@ prev: true next: true description: A tutorial on configuring your Unity project for custom enemies. --- -# ExampleEnemy Unity Project +# `ExampleEnemy` Unity Project ::: warning IMPORTANT The Unity project this page references is in the [LC-ExampleEnemy](https://github.com/Hamunii/LC-ExampleEnemy) repository! So if you didn't already download your copy of the project, now is the time to do it! @@ -21,28 +21,28 @@ Also, the `SETUP-PROJECT.py` script will copy all of the dlls files for you! So The Unity project we have is based off of Evaisa's [Lethal Company Unity Template](https://github.com/EvaisaDev/LethalCompanyUnityTemplate/). However, just like with our dlls in the root directory of our project, we need to add some dll files into our `UnityProject/Assets/Plugins` folder. These are listed in the README of Evaisa's repository, but here's the list so you don't miss it: ::: details List of game DLLs -- AmazingAssets.TerrainToMesh.dll -- ClientNetworkTransform.dll -- DissonanceVoip.dll -- Facepunch Transport for Netcode for GameObjects.dll -- Facepunch.Steamworks.Win64.dll -- Newtonsoft.Json.dll -- Assembly-CSharp-firstpass.dll +- `AmazingAssets.TerrainToMesh.dll` +- `ClientNetworkTransform.dll` +- `DissonanceVoip.dll` +- `Facepunch Transport for Netcode for GameObjects.dll` +- `Facepunch.Steamworks.Win64.dll` +- `Newtonsoft.Json.dll` +- `Assembly-CSharp-firstpass.dll` ::: We also want to add various DLL files our own DLL files might depend on, so let's add the following DLL files from `Lethal Company/BepInEx/core`: ::: details List of BepInEx Core DLLs -- 0Harmony20.dll -- 0Harmony.dll -- BepInEx.dll -- BepInEx.Preloader.dll -- HarmonyXInterop.dll -- Mono.Cecil.dll -- Mono.Cecil.Mdb.dll -- Mono.Cecil.Pdb.dll -- Mono.Cecil.Rocks.dll -- MonoMod.RuntimeDetour.dll -- MonoMod.Utils.dll +- `0Harmony20.dll` +- `0Harmony.dll` +- `BepInEx.dll` +- `BepInEx.Preloader.dll` +- `HarmonyXInterop.dll` +- `Mono.Cecil.dll` +- `Mono.Cecil.Mdb.dll` +- `Mono.Cecil.Pdb.dll` +- `Mono.Cecil.Rocks.dll` +- `MonoMod.RuntimeDetour.dll` +- `MonoMod.Utils.dll` ::: It seems that `BepInEx.Harmony.dll` causes Unity to crash, so we don't include it. @@ -57,24 +57,64 @@ We also depend on LethalLib by Evaisa (which is already included in the project) >- MMHOOK_Facepunch Transport for Netcode for GameObjects.dll ::: -The dll file of our mod also needs to be there so we can reference [ExampleEnemyAI.cs](https://github.com/Hamunii/LC-ExampleEnemy/blob/main/Plugin/src/ExampleEnemyAI.cs) from a component of the ExampleEnemy prefab in Unity. We need to do this via a dll file, we cannot just copy and paste the ExampleEnemyAI.cs file in the Unity project because asset bundles cannot contain scripts, and it just doesn't get the reference otherwise. You know it doesn't get the reference in the form of a yellow warning text if you launch the game with the mod and you have unity logging enabled in the `BepInEx.cfg` file. +The dll file of our mod also needs to be there so we can reference [`ExampleEnemyAI.cs`](https://github.com/Hamunii/LC-ExampleEnemy/blob/main/Plugin/src/ExampleEnemyAI.cs) from a component of the ExampleEnemy prefab in Unity. We need to do this via a dll file, we cannot just copy and paste the ExampleEnemyAI.cs file in the Unity project because asset bundles cannot contain scripts, and it just doesn't get the reference otherwise. You know it doesn't get the reference in the form of a yellow warning text if you launch the game with the mod and you have unity logging enabled in the `BepInEx.cfg` file. -## Our ExampleEnemy Assets in Unity +## Our `ExampleEnemy` Assets in Unity ::: tip The way we figure out how enemies are configured in Unity is done by looking at the Asset Ripper's Unity project output of the game files. You can use [AssetRipper Guid Patcher](https://github.com/ChrisFeline/AssetRipperGuidPatcher) to get a Unity project based on the game files! ::: -We have made an ExampleEnemy folder in our Unity project. Everything that goes into our asset bundle is in there. +We have made an `ExampleEnemy` folder in our Unity project. Everything that goes into our asset bundle is in there. The first thing we did was import our fbx model into Unity. This is as simple as dragging our fbx file into our assets, or right clicking and choosing `Import New Asset...` and choosing our fbx file. The exported fbx model contains all our materials, textures and animations when first imported, but it is good to separate some of that stuff into their own folders. We have extracted our materials into the `Materials` folder. We have also copied the individual animations into the `Animations` folder, because I don't know how to separate them properly, but we can just ignore the animations embedded in the fbx file and use the copies inside the `Animations` folder anyways. -Anyways, how do we make the game see our assets as an enemy? Well, we create a new ScriptableObject of type EnemyType. This can be done by right clicking in your asset files, and doing `Create` -> `ScriptableObjects` -> `EnemyType`. This is what the game uses, so we need it too. Do note that these ScriptableObjects come from the Lethal Company Unity Template this is based off of. Do also note that our UnityProject in this repository is already configured properly. - -The EnemyType ScriptableObject has some configuration options, and the most important thing is the "Enemy Prefab" part of it. This is where we tell it what the model and whatever stuff our EnemyType has. Also note the "Enemy Name" thingy, this will be the name of the example enemy in the coding side of things. - -### The ExampleEnemy Prefab +Anyways, how do we make the game see our assets as an enemy? Well, we create a new `ScriptableObject` of type `EnemyType`. This can be done by right clicking in your asset files, and doing `Create` -> `ScriptableObjects` -> `EnemyType`. This is what the game uses, so we need it too. Do note that these `ScriptableObjects` come from the Lethal Company Unity Template this is based off of. Do also note that our UnityProject in this repository is already configured properly. + +The `EnemyType` `ScriptableObject` has some configuration options, and the most important thing is the "Enemy Prefab" part of it. This is where we tell it what the model and whatever stuff our `EnemyType` has. Also note the "Enemy Name" thingy, this will be the name of the example enemy in the coding side of things. + +### The `EnemyType` Scriptable Object +#### Spawning Logic +Enemy Type options: +- Probability Curve: + - Y-axis: Probability from 1 to 0, presumably 100% to 0% of the enemy's rarity or spawn weight given when registering the enemy. + - X-axis: Probability from 1 to 0, presumably 100% to 0% of the daytime cycle, e.g. from 8am to 11:59pm ingame. + So if you wanted your enemy to be spawning from 3pm to 6pm with 50% spawn weight on 3pm and linearly increasing to 75% onto 6pm, you'd do something like this: (43.15% to 62.5% so 0.4315 to 0.625 on the X-axis, which controls what time of day | 50% to 75% so 0.5 to 0.75 on the Y-axis, which controls the percent of spawn weight used) +- Spawning Disabled: disables the natural spawn of your enemy +- Number Spanwed Falloff: hard to explain mathematically, but the use case is for when you'd want to reduce the probability of your monster spawning for every other monster spawned, this is used for beehive code wherein the more beehives spawned, the lower the chance for the next beehive to spawn. +- Use Number Spawned Falloff: Whether to use just the Probability Curve or to use both the Probability Curve and the Number Spawned Falloff +- Enemy Prefab: The prefab +- Power Level: How much this enemy contributes to the moon's internal max power level +- Max Count: The max number of this enemy which can naturally spawn +- Number Spawned: The number of this enemy which spawn at the start of the level +- Is Outside Enemy: decides if the enemy is an "outside" creature +- Is Daytime Enemy: decides of the enemy is a "daytime" creature +- Normalized Time In Day To Leave: a value in the range [0, 1] showing the percenage of each day for which the enmy is despawned (e.g. at `0.5`, the daytime enemy despawns at 4pm) + +#### Misc. ingame properties +- Stun Time Multiplier: for how long the enemy can be stunned for (the default value is `1`; `0` means unused) +- Door Speed Multiplier: for how long the enemy takes to open doors. +- Stun Game Difficulty Multiplier: for how difficult it is to stun the enemy with a zap gun. +- Can Be Stunned (`bool`) +- Can Die (`bool`) +- Destroy On Death: Whether or not the `GameObject` is destroyed upon death. +- Can See Through Fog: Whether the enemy's line of sight goes through fog. + +#### Vent Properties +- Time To Play Audio: the delay of playing vent audio after the enemy spawns (specific to "inside" enemies only) +- Loudness Multiplier: the volume multiplier for the Vent SFX. +- Override Vent SFX: The audio clip which replaces the vent sound. Leave as `None` to use the default audio sound. (e.g. "kwoosh") +- Hit Body SFX: for when the enemy's body is hit (e.g. "tushhh") +- Hit Enemy Voice SFX: for when the enemy's body is hit (e.g. "aaah") +- Death SFX: for when the enemy dies (e.g. "Aaaah!") +- Stun SFX: for when the enemy is stunned (e.g. "Bzzzzt") +- Misc Animations: Unused +- Audio Clips: the other audio clips you want to use (e.g. footstep sounds e.g. "badoosh.... badoosh..." (loops*1)) + +*1 Well, technically you would use an `AnimationEvent`, not loops. + +### The `ExampleEnemy` Prefab ::: tip If you don't know what prefabs are, see https://docs.unity3d.com/Manual/Prefabs.html @@ -100,7 +140,7 @@ We also have these as children of the prefab itself: - Layer: `ScanNode` - It also should have the following components: - Scan Node Properties (Script) - - **Notice:** The `Creature Scan ID` property is overridden by LethalLib, so it does not matter what we set it as. Same goes for the `Creature File ID` on the bestiary Terminal Node. + - **Notice:** The `Creature Scan ID` property is overridden by LethalLib, so it does not matter what we set it as. Same goes for the `Creature File ID` on the bestiary `TerminalNode`. - A collider, such as: `Box Collider`. While not necessary, it's a good idea to set `isTrigger: true` in order to avoid unwanted collisions with this object. 2. MapDot - Allows us to see the enemy on map. Make sure the following is set: @@ -116,7 +156,7 @@ We also have these as children of the prefab itself: - A collider, such as: `Box Collider` with `isTrigger: true` - `Rigidbody`, so it can interact with certain colliders. This is also needed for our enemy to be able to open doors. 4. TurnCompass - - Does nothing by itself, but we have a reference to this in the [ExampleEnemyAI.cs](https://github.com/Hamunii/LC-ExampleEnemy/blob/main/Plugin/src/ExampleEnemyAI.cs) script to make the enemy looking at player a bit easier. + - Does nothing by itself, but we have a reference to this in the [`ExampleEnemyAI.cs`](https://github.com/Hamunii/LC-ExampleEnemy/blob/main/Plugin/src/ExampleEnemyAI.cs) script to make the enemy looking at player a bit easier. 5. AttackArea - Does nothing by itself, but we take its position and scale and check if the player exists inside that area for the head swing attack. 6. CreatureSFX @@ -126,15 +166,24 @@ We also have these as children of the prefab itself: 8. Eye - The point from which the game checks for line of sight in some methods. Make sure to reference this as the `Eye` in your AI script in Unity. +### Animator +To access the animator: +1. assign the prefab `Animator` component +1. make a Unity Animator ThingTM +1. access the animator (at the top of the screen there should be an animator button) +1. create one layer +1. Add an entry and add an "Animation Thing For Now Because I Don't Know The Name" for every animation you have in the animations folder +1. I'll do the rest at home + ### ExampleEnemy Terminal Entry -We need a TerminalNode ScriptableObject for our entry in the bestiary. This contains the bestiary text and displayed enemy name. +We need a `TerminalNode` `ScriptableObject` for our entry in the bestiary. This contains the bestiary text and displayed enemy name. ::: warning If an existing item in the game starts with the same word as your enemy's name, that can cause the game to think we are trying to buy that item and not being able to open the bestiary entry. As a workaround, you can try changing the name that is shown and used for opening the terminal entry. ::: -We also have a TerminalKeyword ScriptableObject, which has the word that the user needs to write in the terminal to find the page. +We also have a `TerminalKeyword` `ScriptableObject`, which has the word that the user needs to write in the terminal to find the page. The enemy spinning animation on the bestiary entry background is a video file, and you can make one yourself in Blender by for example using the decimate (if you have a lot of geometry) and wireframe modifiers. @@ -150,4 +199,4 @@ We need to package our assets into an Asset Bundle in order to be able to load t We have a `SETUP-PROJECT.py` script in our project which generates a `csproj.user` file. This file will copy your mod DLL and Asset Bundle to the path you specified when running the setup script, each time you build your plugin. Just make sure to keep the asset bundle name the default, or you'll have to edit your `csproj.user` file to look for the new name, in which case you may also want to edit our setup script to look for this new name in the file it generates. -::: \ No newline at end of file +::: From 6dfe2c702c86c810b84a0a9dcf2229f995837f3b Mon Sep 17 00:00:00 2001 From: XuuXiao <126674348+XuuXiao@users.noreply.github.com> Date: Thu, 14 Mar 2024 04:44:26 +0000 Subject: [PATCH 02/14] Add files via upload --- .../unity/PinkGiantEnemyTypeInspector.png | Bin 0 -> 71208 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/public/images/lethallib/custom-enemies/unity/PinkGiantEnemyTypeInspector.png diff --git a/docs/public/images/lethallib/custom-enemies/unity/PinkGiantEnemyTypeInspector.png b/docs/public/images/lethallib/custom-enemies/unity/PinkGiantEnemyTypeInspector.png new file mode 100644 index 0000000000000000000000000000000000000000..565a3614b5c8acf4232243763167b9cf0bb58b9f GIT binary patch literal 71208 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�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 literal 0 HcmV?d00001 From 2341088250ff1aa6dcbf89168283498df5ea63af Mon Sep 17 00:00:00 2001 From: XuuXiao <126674348+XuuXiao@users.noreply.github.com> Date: Thu, 14 Mar 2024 04:45:21 +0000 Subject: [PATCH 03/14] Add files via upload --- .../unity/ExampleEnemyTypeProbabilityCurve.png | Bin 0 -> 5832 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/public/images/lethallib/custom-enemies/unity/ExampleEnemyTypeProbabilityCurve.png diff --git a/docs/public/images/lethallib/custom-enemies/unity/ExampleEnemyTypeProbabilityCurve.png b/docs/public/images/lethallib/custom-enemies/unity/ExampleEnemyTypeProbabilityCurve.png new file mode 100644 index 0000000000000000000000000000000000000000..1acf05393b9a9f648ae501edfe6a9905934dfd53 GIT binary patch literal 5832 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 literal 0 HcmV?d00001 From c36c3075aacba7f26227ec3e6eb0112d3bdea450 Mon Sep 17 00:00:00 2001 From: XuuXiao <126674348+XuuXiao@users.noreply.github.com> Date: Thu, 14 Mar 2024 04:46:09 +0000 Subject: [PATCH 04/14] Add files via upload --- .../unity/ExampleEnemyTypeFalloff.png | Bin 0 -> 7069 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/public/images/lethallib/custom-enemies/unity/ExampleEnemyTypeFalloff.png diff --git a/docs/public/images/lethallib/custom-enemies/unity/ExampleEnemyTypeFalloff.png b/docs/public/images/lethallib/custom-enemies/unity/ExampleEnemyTypeFalloff.png new file mode 100644 index 0000000000000000000000000000000000000000..e12c05aab8b64609633627ed0f85b4ffb04c1375 GIT binary patch literal 7069 zcmZ8m3p|tU`+uAoDU%904LL?8dK+OA5jjT*Ih125#}MWaWksY^h%8Bz(9c;iq&Ll> zDWW;6Ow4S~V;lcxR&Ve7_xbE&&#wEq@9Vyv@AbXD*ZthIwLZ3etHf3S0JfW(9X$a6 zTuAUkuS0zqa@p#UJ%%KmV* z1r~b&fTXzj(IXC5+$h5~fl_VRZF3T-D(&awofJ-;;N2Tyi6A}{_jyC?k+gsO!2F(iocy)S%XQovqwfXM;?1Rd@QrDk7`C75AaM#jq zZvg7AVb73*_C4A?2KHYFD?A5ZM?Z7DP?>}}WfSK3MN~{IqU(l`l#WL~6o#xKKZ%*L zaIYZ8F~7sYU8^bx*!kgNcf@r6e!^-Ti|mew+hC0LG}gf5Ry&@t+_~fBt5uTy=H|p2 zl&AYs=ZDe7qoxI)D*tXP3`l?m1ooCoPBg6AHl3N~HcTGlc`VcdF_cb##vkT|0b%?| zU|JXr^vcnJVq+SYE#}vNM`v0P2!yYXkI(1EV|eYzwlrz7z8(ZXhAMq&NrZHL`}V}i z*?C$&Xo%98txfuY&sc65)k(7|J!LV<1)y{jZJeX9==q!V!QV~S+G8s#E0?oUQ@2;v z*PlOjHVccj8RcV-qV|=#kd`TfQzHdwQo0p^AH;NV?j6Da`aoZ1NQmmth3d}+p0(tq zsMio6Rzi&)9v;3N7A1A~@(0|hd(nd{ozw4M5J!mC?y3*&F+TMjE4&YFw%N;v<;_j+ z7%Dh+JKQ-^P*89=q?TXARMJI~v`(PrluEi>$7I~Ajg0A;VKS^$CwOR%W%-k!x8{<5 zpYg$T+S$SA=<&CF(TwD4!_V!DX1vQT2b`%7QDl{yD$6OHU8Jo*Q&)ZF-@-B`PAXV=1XN(Hdo-o`>XH6Z#}sO_&0SIA_rI$?_{~k&hp$%Ahl<^6^(Woeyo^P{ zL-5hFL%NJdqwVds3CC3=p@w z?^}j#Mtt-#(U;;sJQ7Vc7+jMim0QF-3qTGqKjdbi?2fBYs=_<(6V*sJqiyb;Kw>}fn^HQn)v6xCA}Jv^hI_7aU_&Zd6c&dJZrfqJcGa4Ej zFSS~W5+C%})YQxzpuSm1GjQu`9r=3Z!4sD#fO+aPO<+&9NrLs^zedmtR^XoBC{fLi zVe}W&N*i+!fwPjIw*pFq-JC0a6Wz^oQpyOqBLXkk$p-p;l7h@Q}?0IE^x6Q^Noo)z*VDArH6&XKYXM4PDx~W=uNya#Y?9mjhiI^gF18AllkJ zn@j8nIH&Qg0%W8`x#QLzRN+>bpr$q0uOe+3k4a8`$= z>_BMooa8Ldrmaas2*lRv_rT|TzXq~d49E3z40ypIuYV7d$_f!F7Txq&Cr$7B_WlbL zpRU;eoZJoa(redR=lu;bUSH=i(v?jw7u;Q3wS)IsOT@&o&_?jl%(X6CoXd@+oF9@I z+rv7d*F&EBV_rziEAL+OI^aAV;jp<8Eut{+lpmLS=;6?ZZ4P{!)Cz|@%jJD>{U53g zuUzx)1V zdD4*hJTr%EwR6A8lv`XrA^UN4?7|Z?0ybUy$xoALTWd!cwMO16m=IfoIQp|lCaVF+ zUUG^CPo4HmDd+2MQ+q_3#32Fz1v z%mejbCC=T)No_}H5ODTS8Vtr(-HJF5Il}+isuoGsZNl=J(ivf@*-qfmFE{2%+`gVJH%93-Rig& z&IEz}>F0le{(7KxfzaNBo~m$d^Yv_)ZR=ksij6M#74xJ#2+-nXeAC>LB)?O5w}Duj z0-D> zPGkh%;tY4suZc9H!ms`s%a$KGB7-fT@?7|uuYGx-;1?`Q zeL10$*I6y-F<;lq$96z*SwKi)u-V~XLEU5Qz?E@~vpIRjk1g>xIU8U*wE##Qcv^{y(f!2Unr?>jTpdbq96)YmN2ej<8;z zR~yBwS7lU}bL%uacP_WK~?hW!|~>)~|7u1%HTTOkLS?Lf=qC-P)%+XM<$`APy$ zmel6=P5DOnDwMWNu>_8Dl5>Hd?dhLwMfw%scS;#%b5NJ}KWVAGw=;QUp?@Z@IdF8h ztqf;!jOgCHF`(T6#Jes+Key*`{m8*jC+^KIk-&1=k}Jun)`15lED!Z|O+ruQ;W23B zhCV-%Q~b1vw(%ft+mCEUabXu2(TU%<1cN9A^2;2@5t)KS9u>$RxC2>UQYwATV;Pf_ zG-*#-HQbQu&G&Vk(%~!G1653S~NW&LW`uZM7SGtJ` zR1MY!=CopaZNd`y!6Y;LqDl~$D!YDn0@4X^&21*oTemlBmYA^V1+HYy17@eP7@J7vIC$eW zhCnot{~!xzc%WZH^Kb&(5KVyG`qy+GUC^8<(fG5QIb&k?E?4sE$MdrLaTAptEqSOV zvS`#QvbVewzCjC?mdk@6p66uv$y=$E#1X=epiUfm#XqT*4#fi8*x0a9E;=D z2)(-Rmmj+b6mAxWf%bhE`N;hk{wL5|!EE}OI##0cev)VH*LbPShUNm!ws*f@K^q2g zY9U`1hUY7L32RVGB;}RUyT`khp51&O=whcTvx66^rJ@frvs=Sw2yk1_N{;R1=U0G{r@nk zkSk?ymEpEN0P$A}co*Iv_Pg^{7!{9_0eHcpP-QLZ2@lIaRj>~0f$ej9#6o^-_CYMZ@O_l>c{zb7;fav1Ashb!0+=O=c!`f^r$Y(P`Ya(>G6(^yUCGcD?!H@K<@JtrIUyT|ierZ(-1DGV{GYlVw~P8IwUX zR@{MpwI0PPCyf(iBo^*_O-kbDSqjX%tP<>*YAVl3BU;Ph>Y#Qhy6b#!dTv9ydYlFspQF-+%0#%lVOb=Oy;^mA5z{hwUwxG<9ZY3Eq2l!$4t? z?ZNV$S1#yRex1kHxNVPsnmsEtQFo`zC$O3>g}kw3EgxYklfZw9D1B^Mi7;zwv14fv zvUy-&d59NKO@LYx72&puys)*q9cLaV^CP!;wM~^2>KXD0ql2D&!R(XY6s&TYsYRB?f)v9%F)_|@~BmR z*vss?9YxW-RM~;{mHgNYv}Z+rfTig7L&fOm=Q-$8$54 ze&nrG$%i{65}=;reWKTHj2X-MEy*eH!rq&fK=bA3w&I{Kpr=ON)5d1}$X&@Tg2LPh z(ChhMFt);I6{$qA<_KQcR&SS>y(nG*%PlRK6Wy(X*d3sWKzj?CjvJRiaq@KAtx;FT zwG*I)Prg84pmlpGlAb(fJay$E4-Q;qpK}b&Zd2oXe7u&IysxQ#q>AjPT0!3Sixk0! zEf9G3bgKe5%j+1M%RzxKrTDQ#vASAl#!*^}npOa; z6nQUoED=!=&A3SCQk18U?bZu`Ar2LI@xtC5g~LIS@x5+grTUbATzy4D4%H^0(XEzz zs>HiLahuEfE6-&{_&V5Oy%??j@>fF|;eGgi`f9^DZk&>&QF`4ElRf;%D=CsWc3{r9k*~pO>mD0|>t+s*LUvsrGuEWz zpeAy3;cFL-Lf%46Wa+}UVjf91i}NFSy>l6B@!MK3vcV~W?~l;rbcVhq1n)rep9oJ8 z99=oPix-w)Vgoldp~?9zE}mmw*20-TX@)|)uzhFUF_3W#7eCU$w5T<4#BG})E&oJ? zt{(j(R0A|ClPQ=Q=YmWNK|cw82f=10nY zSsj53pfuu2Qpb3f)2XawxAi9v`H_zyI7Ug$)fVO3kEHa%UoKoRgGZ)u8TGJ+Vf&k> zgOt8xYx{QMGn6Tnmx85ooGG7B(QJDS9H#>ip~_iOpo7L<_V-$ zFn~+^N)f1MbPT*rp;`Uq6?6xj?~oSv$y3z-<uaM`|NB1hQh)yq_u^n^mjy1N2k5fj53b0ycmR7!CfuFKeBarq<%^4(W#Fv?iKRi2p$ddm3)H(0E&b3Y@ql|& zQxfhpp=>IX9ML)F*_I&|mE%VPbL(`Ic=UBQ* zujvL=uu>J#p%Yg>)EKq!;ykO$TZpMq-)VrPYdNmRHLWyKiIje~=t~{|X?1m_u~(7) zY@ubp(a(uZ!RC&Ao^$&UN=un!v$);h`~*J3onWw%8@bSh=qit0Qe&)@$FckuhN-dr zZy2);q=9OGo~8?A%ozD9vVkTn+)9FQ4kKMe6s`IHeBSg2s&hErFzBwa(r~f(3{Afnq{xXh;7|= z>_C`02ND&_)kVT9%=-{<}p# z4eb1LzOwlS!Qr9hjhcuZVCauG#4wg|CcRHoBK&n@@b5pAVUAZF0=>94pcfiy(FGi58G+`(VUMIGX-;YOmS$~M$58X@|+ z7v?jKVuR*o|CbK?{75gNbBWwf!KLqz$ctS&zt94KePy||EgGjZm(I*D^p>ZeZS}rE zI}1KU@60$RJ$O(njycyx;a5Qf44I9dCoeUqX@8rLR%pho?f3o}S^tjcQp}`PY!Ew# zhK6vSKeUP&;&fFTRy)QU^WXR!a7n^+$$GxA9IKRs-q`~Uy| literal 0 HcmV?d00001 From f261b9923536660e6c7d7657a358557ffe0df8e0 Mon Sep 17 00:00:00 2001 From: XuuXiao <126674348+XuuXiao@users.noreply.github.com> Date: Thu, 14 Mar 2024 04:46:20 +0000 Subject: [PATCH 05/14] Add files via upload From 4d83387108b7ddf22d0dfb9ea25f9efa42498c3a Mon Sep 17 00:00:00 2001 From: XuuXiao <126674348+XuuXiao@users.noreply.github.com> Date: Thu, 14 Mar 2024 05:13:06 +0000 Subject: [PATCH 06/14] Add files via upload --- .../custom-enemies/unity/PinkGiantAnimator.png | Bin 0 -> 10110 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/public/images/lethallib/custom-enemies/unity/PinkGiantAnimator.png diff --git a/docs/public/images/lethallib/custom-enemies/unity/PinkGiantAnimator.png b/docs/public/images/lethallib/custom-enemies/unity/PinkGiantAnimator.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb6eec93091b212822b4421fac334ffa4758991 GIT binary patch literal 10110 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 R_Jf=PD9NkImC1Yv{$GlKdfxy5 literal 0 HcmV?d00001 From fcde867920a3cdd9f38233c962e823b118dd7779 Mon Sep 17 00:00:00 2001 From: XuuXiao <126674348+XuuXiao@users.noreply.github.com> Date: Thu, 14 Mar 2024 05:21:43 +0000 Subject: [PATCH 07/14] Add files via upload --- .../unity/PinkGiantAnimatorTransition.png | Bin 0 -> 9577 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/public/images/lethallib/custom-enemies/unity/PinkGiantAnimatorTransition.png diff --git a/docs/public/images/lethallib/custom-enemies/unity/PinkGiantAnimatorTransition.png b/docs/public/images/lethallib/custom-enemies/unity/PinkGiantAnimatorTransition.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbaaa991cfe241d4c5bce4841454439f08f3126 GIT binary patch literal 9577 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 G_&)$K1A+el literal 0 HcmV?d00001 From 752b02b0773d68703cd6175e8a937184b792524e Mon Sep 17 00:00:00 2001 From: XuuXiao <126674348+XuuXiao@users.noreply.github.com> Date: Thu, 14 Mar 2024 05:21:51 +0000 Subject: [PATCH 08/14] Add files via upload From 26a817331fa09343ec17ebf131440656af9582ab Mon Sep 17 00:00:00 2001 From: XuuXiao <126674348+XuuXiao@users.noreply.github.com> Date: Thu, 14 Mar 2024 06:24:04 +0000 Subject: [PATCH 09/14] Update unity-project.md to fix some formatting mistakes, add an AnimationEvents, Animator and EnemyType categories. --- .../lethallib/custom-enemies/unity-project.md | 57 +++++++++++++------ 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/docs/dev/apis/lethallib/custom-enemies/unity-project.md b/docs/dev/apis/lethallib/custom-enemies/unity-project.md index 18066d6e60d..eda70a4577d 100644 --- a/docs/dev/apis/lethallib/custom-enemies/unity-project.md +++ b/docs/dev/apis/lethallib/custom-enemies/unity-project.md @@ -27,7 +27,7 @@ The Unity project we have is based off of Evaisa's [Lethal Company Unity Templat - `Facepunch Transport for Netcode for GameObjects.dll` - `Facepunch.Steamworks.Win64.dll` - `Newtonsoft.Json.dll` -- `Assembly-CSharp-firstpass.dll` +- `Assembly-CSharp-firstpass.dll`D ::: We also want to add various DLL files our own DLL files might depend on, so let's add the following DLL files from `Lethal Company/BepInEx/core`: @@ -76,14 +76,18 @@ The `EnemyType` `ScriptableObject` has some configuration options, and the most ### The `EnemyType` Scriptable Object #### Spawning Logic + +![Screenshot: PinkGiant EnemyType in inspector](/images/lethallib/custom-enemies/unity/PinkGiantEnemyTypeInspector.png) Enemy Type options: - Probability Curve: - Y-axis: Probability from 1 to 0, presumably 100% to 0% of the enemy's rarity or spawn weight given when registering the enemy. - X-axis: Probability from 1 to 0, presumably 100% to 0% of the daytime cycle, e.g. from 8am to 11:59pm ingame. - So if you wanted your enemy to be spawning from 3pm to 6pm with 50% spawn weight on 3pm and linearly increasing to 75% onto 6pm, you'd do something like this: (43.15% to 62.5% so 0.4315 to 0.625 on the X-axis, which controls what time of day | 50% to 75% so 0.5 to 0.75 on the Y-axis, which controls the percent of spawn weight used) + So if you wanted your enemy to be spawning from 3pm to 6pm with 50% spawn weight on 3pm and linearly increasing to 75% onto 6pm, you'd do something like this: (43.15% to 62.5% so 0.4315 to 0.625 on the X-axis, which controls what time of day | 50% to 75% so 0.5 to 0.75 on the Y-axis, which controls the percent of spawn weight used). +![Screenshot: PinkGiant EnemyType ProbabilityCurve in inspector](/images/lethallib/custom-enemies/unity/ExampleEnemyTypeProbabilityCurve.png) - Spawning Disabled: disables the natural spawn of your enemy -- Number Spanwed Falloff: hard to explain mathematically, but the use case is for when you'd want to reduce the probability of your monster spawning for every other monster spawned, this is used for beehive code wherein the more beehives spawned, the lower the chance for the next beehive to spawn. -- Use Number Spawned Falloff: Whether to use just the Probability Curve or to use both the Probability Curve and the Number Spawned Falloff +- Number Spawned Falloff: hard to explain mathematically, but the use case is for when you'd want to reduce the probability of your monster spawning for every other monster spawned, this is used for beehive code wherein the more beehives spawned, the lower the chance for the next beehive to spawn. +![Screenshot: PinkGiant EnemyType Number spawned Falloff in inspector](/images/lethallib/custom-enemies/unity/ExampleEnemyTypeFalloff.png) +- Use Number Spawned Falloff: Whether to use just the Probability Curve or to use both the Probability Curve and the Number Spawned Falloff. - Enemy Prefab: The prefab - Power Level: How much this enemy contributes to the moon's internal max power level - Max Count: The max number of this enemy which can naturally spawn @@ -93,7 +97,7 @@ Enemy Type options: - Normalized Time In Day To Leave: a value in the range [0, 1] showing the percenage of each day for which the enmy is despawned (e.g. at `0.5`, the daytime enemy despawns at 4pm) #### Misc. ingame properties -- Stun Time Multiplier: for how long the enemy can be stunned for (the default value is `1`; `0` means unused) +- Stun Time Multiplier: for how long the enemy can be stunned for (the default value is likely `1` despite saying `0` in inspector) - Door Speed Multiplier: for how long the enemy takes to open doors. - Stun Game Difficulty Multiplier: for how difficult it is to stun the enemy with a zap gun. - Can Be Stunned (`bool`) @@ -166,25 +170,46 @@ We also have these as children of the prefab itself: 8. Eye - The point from which the game checks for line of sight in some methods. Make sure to reference this as the `Eye` in your AI script in Unity. -### Animator -To access the animator: -1. assign the prefab `Animator` component -1. make a Unity Animator ThingTM -1. access the animator (at the top of the screen there should be an animator button) -1. create one layer -1. Add an entry and add an "Animation Thing For Now Because I Don't Know The Name" for every animation you have in the animations folder -1. I'll do the rest at home +### `Animator` +To access and use the `Animator` for a simple walking animation: +1. Create an `Animator Controller` and assign the prefab the `Animator` component. +2. Double click the `Animator Conroller` to go into its edit menu and create one layer. +3. Start off by doing something simple, like having a spawning into walking animation by right-clicking the green Entry button and making a transition to the first animation you want to start it off with (the spawning animation, or idle animation in the below example), then make another empty state by right-clicking nothingness and make a `sub-state` and naming it walkCycle or something similar, make sure to make two transition arrows pointing between eachother if you'd like to go from one animation to another later, it should look something like this now: +![Screenshot: PinkGiant Animator in inspector](/images/lethallib/custom-enemies/unity/PinkGiantAnimator.png) +4. Click the `sub-state`'s and make sure that attributes such as `Motion` are filled in with a .anim file, and that speed is set to the default 1. +5. Now make some animation conditions, to do this, go to the parameters tab, next to the layers tab under Animator, press the "+" sign and add a `trigger`, this is what you'll call on your code to transition between animations, for now, make a couple like "startWalk" and "stopWalk". +6. Then click the arrows in-between the `sub-state` (e.g. idleCycle into walkCycle, ignoring the arrow from entry), there should be a menu on the side with a lot of options. First, if you would like the walkCycle to loop, then press the `Has Exit Time` attribute, as it'll allow for looping. Second, Work on the transitions between the actual animations such as the idleCycle animation and the walkCycle animation, this will take a bit of fiddling to get the right transition timings. Third, add a condition such as "startWalk" as you're transition from a spawning animation or idle animation, into a walking animation. +![Screenshot: idleCycle to walkCycle animation in Animator](/images/lethallib/custom-enemies/unity/PinkGiantAnimatorTransition.png) +That should be good enough to get you started, this tool is very self-intuitive and takes a bit of practise getting used to, to wrap up this section, I'll be explaining how the `Any State` `sub-state` works, and `AnimationEvent`'s. +#### `Any State` +- `Any State` simply allows you to set a transition from every state into another `sub-state` without making a lot of disorganising connections, each animation transition is edit-able but requires all transition having either `Has Exit Time` turned on, or a global condition such as "stopWalk" inserted, this makes it ideal for animations such as "startDeath" where the enemy dies and needs to interrupt any animation to start its death animation. + +#### `AnimationEvents` +1. `AnimationEvents` allow you to call functions during animations, using the `Animator` section as reference, during the walking animation, to simulate the sound of footsteps, assuming you have access to an `AudioClip` of the footstep sound, create a function that plays the footstep sound. +2. Make sure your enemy prefab is selected, then go down to the menu that says "Project Console", right-click "Project", hover over "Add Tab" and press "Animation", This adds an interactable Animation tab to the bottom, now select it. +3. The tab contains the following: +- An animation player with record, preview, pause, start, etc. +- A few buttons to add keyframes for animation and add events, we'll be focusing on "Add Events" option. +- A drop-down menu that contains all the animations connected to the `Animator` which is connected to the prefab, use that to select the walking animation. +4. To add an `AnimationEvent`, you'd need to first find the frame in which the foot just barely connects to the ground, and press the "Add Event." button, this creates an `Animation Event` in the inspector. +5. Press the "Function:" drop-down menu, select your `EnemyAI`, and find the function that you created to play footstep sounds. + +::: warning IMPORTANT +For whatever reason, a function may not be displayed within your `EnemyAI` in `AnimationEvent` if it contains a parameter such as `AudioClip`, I'm not sure what parameters are not accepted, but making a void function seems to work best. +::: ### ExampleEnemy Terminal Entry -We need a `TerminalNode` `ScriptableObject` for our entry in the bestiary. This contains the bestiary text and displayed enemy name. +We need a `TerminalNode` `ScriptableObject` for our entry in the bestiary. This contains the bestiary's `Display Text` field that may contain sigurd's notes and enemy lore, and `Creature Name` field that shows when the user inputs `bestiary` into the terminal. + + +We also have a `TerminalKeyword` `ScriptableObject`, which has the word that the user needs to write in the terminal to find the page. ::: warning If an existing item in the game starts with the same word as your enemy's name, that can cause the game to think we are trying to buy that item and not being able to open the bestiary entry. As a workaround, you can try changing the name that is shown and used for opening the terminal entry. +Additionally, the `Word` attribute can not have any capital letters in it, they seem to not handle capitals well. ::: -We also have a `TerminalKeyword` `ScriptableObject`, which has the word that the user needs to write in the terminal to find the page. - The enemy spinning animation on the bestiary entry background is a video file, and you can make one yourself in Blender by for example using the decimate (if you have a lot of geometry) and wireframe modifiers. ::: warning IMPORTANT From 8581e32e5e41c5cad9aea8ce5934741dca723ff5 Mon Sep 17 00:00:00 2001 From: XuuXiao <126674348+XuuXiao@users.noreply.github.com> Date: Thu, 14 Mar 2024 23:11:53 +0000 Subject: [PATCH 10/14] Update unity-project.md --- .../lethallib/custom-enemies/unity-project.md | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/dev/apis/lethallib/custom-enemies/unity-project.md b/docs/dev/apis/lethallib/custom-enemies/unity-project.md index eda70a4577d..a5b7366ac69 100644 --- a/docs/dev/apis/lethallib/custom-enemies/unity-project.md +++ b/docs/dev/apis/lethallib/custom-enemies/unity-project.md @@ -57,12 +57,12 @@ We also depend on LethalLib by Evaisa (which is already included in the project) >- MMHOOK_Facepunch Transport for Netcode for GameObjects.dll ::: -The dll file of our mod also needs to be there so we can reference [`ExampleEnemyAI.cs`](https://github.com/Hamunii/LC-ExampleEnemy/blob/main/Plugin/src/ExampleEnemyAI.cs) from a component of the ExampleEnemy prefab in Unity. We need to do this via a dll file, we cannot just copy and paste the ExampleEnemyAI.cs file in the Unity project because asset bundles cannot contain scripts, and it just doesn't get the reference otherwise. You know it doesn't get the reference in the form of a yellow warning text if you launch the game with the mod and you have unity logging enabled in the `BepInEx.cfg` file. +The dll file of our mod also needs to be there so we can reference [ExampleEnemyAI.cs](https://github.com/Hamunii/LC-ExampleEnemy/blob/main/Plugin/src/ExampleEnemyAI.cs) from a component of the ExampleEnemy prefab in Unity. We need to do this via a dll file, we cannot just copy and paste the ExampleEnemyAI.cs file in the Unity project because asset bundles cannot contain scripts, and it just doesn't get the reference otherwise. You know it doesn't get the reference in the form of a yellow warning text if you launch the game with the mod and you have unity logging enabled in the `BepInEx.cfg` file. -## Our `ExampleEnemy` Assets in Unity +## Our Example Enemy Assets in Unity ::: tip -The way we figure out how enemies are configured in Unity is done by looking at the Asset Ripper's Unity project output of the game files. You can use [AssetRipper Guid Patcher](https://github.com/ChrisFeline/AssetRipperGuidPatcher) to get a Unity project based on the game files! +The way we figure out how enemies are configured in Unity is done by looking at the Asset Ripper's Unity project output of the game files. You can use [AssetRipper Guid Patcher](https://github.com/nomnomab/lc-project-patcher/) to get a Unity project based on the game files! ::: We have made an `ExampleEnemy` folder in our Unity project. Everything that goes into our asset bundle is in there. @@ -84,29 +84,29 @@ Enemy Type options: - X-axis: Probability from 1 to 0, presumably 100% to 0% of the daytime cycle, e.g. from 8am to 11:59pm ingame. So if you wanted your enemy to be spawning from 3pm to 6pm with 50% spawn weight on 3pm and linearly increasing to 75% onto 6pm, you'd do something like this: (43.15% to 62.5% so 0.4315 to 0.625 on the X-axis, which controls what time of day | 50% to 75% so 0.5 to 0.75 on the Y-axis, which controls the percent of spawn weight used). ![Screenshot: PinkGiant EnemyType ProbabilityCurve in inspector](/images/lethallib/custom-enemies/unity/ExampleEnemyTypeProbabilityCurve.png) -- Spawning Disabled: disables the natural spawn of your enemy +- Spawning Disabled: disables the natural spawn of your enemy. - Number Spawned Falloff: hard to explain mathematically, but the use case is for when you'd want to reduce the probability of your monster spawning for every other monster spawned, this is used for beehive code wherein the more beehives spawned, the lower the chance for the next beehive to spawn. ![Screenshot: PinkGiant EnemyType Number spawned Falloff in inspector](/images/lethallib/custom-enemies/unity/ExampleEnemyTypeFalloff.png) - Use Number Spawned Falloff: Whether to use just the Probability Curve or to use both the Probability Curve and the Number Spawned Falloff. - Enemy Prefab: The prefab - Power Level: How much this enemy contributes to the moon's internal max power level - Max Count: The max number of this enemy which can naturally spawn -- Number Spawned: The number of this enemy which spawn at the start of the level +- Number Spawned: The number of this enemy which spawn at the start of the level // unsure - Is Outside Enemy: decides if the enemy is an "outside" creature - Is Daytime Enemy: decides of the enemy is a "daytime" creature -- Normalized Time In Day To Leave: a value in the range [0, 1] showing the percenage of each day for which the enmy is despawned (e.g. at `0.5`, the daytime enemy despawns at 4pm) +- Normalized Time In Day To Leave: a value in the range [0, 1] showing the percenage of each day for which the enmy is despawned (e.g. at `0.5`, the daytime enemy despawns at 4pm) // unsure #### Misc. ingame properties -- Stun Time Multiplier: for how long the enemy can be stunned for (the default value is likely `1` despite saying `0` in inspector) -- Door Speed Multiplier: for how long the enemy takes to open doors. -- Stun Game Difficulty Multiplier: for how difficult it is to stun the enemy with a zap gun. +- Stun Time Multiplier: for how long the enemy can be stunned for (the default value is likely `1` despite saying `0` in inspector) // unsure +- Door Speed Multiplier: for how long the enemy takes to open doors. +- Stun Game Difficulty Multiplier: for how difficult it is to stun the enemy with a zap gun. // pretty sure - Can Be Stunned (`bool`) - Can Die (`bool`) - Destroy On Death: Whether or not the `GameObject` is destroyed upon death. -- Can See Through Fog: Whether the enemy's line of sight goes through fog. +- Can See Through Fog: Whether the enemy's line of sight gets clamped to a range between 0 and 30 near fog/on foggy area. #### Vent Properties -- Time To Play Audio: the delay of playing vent audio after the enemy spawns (specific to "inside" enemies only) +- Time To Play Audio: the delay of playing vent audio after the enemy spawns (specific to "inside" enemies only) //unsure about this whole list tbh - Loudness Multiplier: the volume multiplier for the Vent SFX. - Override Vent SFX: The audio clip which replaces the vent sound. Leave as `None` to use the default audio sound. (e.g. "kwoosh") - Hit Body SFX: for when the enemy's body is hit (e.g. "tushhh") From 48dbfcdf1b48cb963ad0faaa6f1845b0386ad730 Mon Sep 17 00:00:00 2001 From: Xu Xiaolan <126674348+XuuXiao@users.noreply.github.com> Date: Thu, 21 Mar 2024 11:56:50 +0000 Subject: [PATCH 11/14] Update unity-project.md Updated enemy Type with more confirmed values, just the misc section left to confirm --- .../lethallib/custom-enemies/unity-project.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/dev/apis/lethallib/custom-enemies/unity-project.md b/docs/dev/apis/lethallib/custom-enemies/unity-project.md index a5b7366ac69..65425a00e0e 100644 --- a/docs/dev/apis/lethallib/custom-enemies/unity-project.md +++ b/docs/dev/apis/lethallib/custom-enemies/unity-project.md @@ -84,25 +84,25 @@ Enemy Type options: - X-axis: Probability from 1 to 0, presumably 100% to 0% of the daytime cycle, e.g. from 8am to 11:59pm ingame. So if you wanted your enemy to be spawning from 3pm to 6pm with 50% spawn weight on 3pm and linearly increasing to 75% onto 6pm, you'd do something like this: (43.15% to 62.5% so 0.4315 to 0.625 on the X-axis, which controls what time of day | 50% to 75% so 0.5 to 0.75 on the Y-axis, which controls the percent of spawn weight used). ![Screenshot: PinkGiant EnemyType ProbabilityCurve in inspector](/images/lethallib/custom-enemies/unity/ExampleEnemyTypeProbabilityCurve.png) -- Spawning Disabled: disables the natural spawn of your enemy. -- Number Spawned Falloff: hard to explain mathematically, but the use case is for when you'd want to reduce the probability of your monster spawning for every other monster spawned, this is used for beehive code wherein the more beehives spawned, the lower the chance for the next beehive to spawn. +- Spawning Disabled: disables the natural spawning of your enemy. +- Number Spawned Falloff: hard to explain mathematically, but the use case is for when you'd want to reduce the probability of your monster spawning for every other of the same monster spawned, this is used for beehive code wherein the more beehives spawned, the lower the chance for the next beehive to spawn. ![Screenshot: PinkGiant EnemyType Number spawned Falloff in inspector](/images/lethallib/custom-enemies/unity/ExampleEnemyTypeFalloff.png) -- Use Number Spawned Falloff: Whether to use just the Probability Curve or to use both the Probability Curve and the Number Spawned Falloff. -- Enemy Prefab: The prefab -- Power Level: How much this enemy contributes to the moon's internal max power level -- Max Count: The max number of this enemy which can naturally spawn -- Number Spawned: The number of this enemy which spawn at the start of the level // unsure -- Is Outside Enemy: decides if the enemy is an "outside" creature -- Is Daytime Enemy: decides of the enemy is a "daytime" creature -- Normalized Time In Day To Leave: a value in the range [0, 1] showing the percenage of each day for which the enmy is despawned (e.g. at `0.5`, the daytime enemy despawns at 4pm) // unsure +- Use Number Spawned Falloff: Whether to use just the Probability Curve or to use both the Probability Curve and the Number Spawned Falloff to dynamically affect the enemy's spawn weight mid-round. +- Enemy Prefab: The prefab. +- Power Level: How much this enemy contributes to the moon's internal max power level. +- Max Count: The max number of this enemy which can naturally spawn. +- Number Spawned: *this should be a private value, ignore* +- Is Outside Enemy: decides if the enemy is an "outside" creature. +- Is Daytime Enemy: decides if the enemy is a "daytime" creature. +- Normalized Time In Day To Leave: a value in the range [0, 1] showing the percenage of each day for which the enemy is calling a method (e.g. at `0.5`, the daytime enemy runs the method at 4pm) // check pls #### Misc. ingame properties -- Stun Time Multiplier: for how long the enemy can be stunned for (the default value is likely `1` despite saying `0` in inspector) // unsure +- Stun Time Multiplier: for how long the enemy can be stunned for. // unsure - Door Speed Multiplier: for how long the enemy takes to open doors. - Stun Game Difficulty Multiplier: for how difficult it is to stun the enemy with a zap gun. // pretty sure - Can Be Stunned (`bool`) - Can Die (`bool`) -- Destroy On Death: Whether or not the `GameObject` is destroyed upon death. +- Destroy On Death: Whether or not the `GameObject` is destroyed upon enemy death. - Can See Through Fog: Whether the enemy's line of sight gets clamped to a range between 0 and 30 near fog/on foggy area. #### Vent Properties From f9a3bc6b31fcd845cc7470d7bbd2363a79d3232c Mon Sep 17 00:00:00 2001 From: Xu Xiaolan <126674348+XuuXiao@users.noreply.github.com> Date: Thu, 21 Mar 2024 22:03:03 +0000 Subject: [PATCH 12/14] Update unity-project.md Misc. ingame properties confirmed all true, Vent properties missing the `Time To Play Audio` to be confirmed, and thats all for this PR --- .../lethallib/custom-enemies/unity-project.md | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/dev/apis/lethallib/custom-enemies/unity-project.md b/docs/dev/apis/lethallib/custom-enemies/unity-project.md index 65425a00e0e..5484baa3609 100644 --- a/docs/dev/apis/lethallib/custom-enemies/unity-project.md +++ b/docs/dev/apis/lethallib/custom-enemies/unity-project.md @@ -1,4 +1,4 @@ ---- +![image](https://github.com/XuuXiao/ModdingWiki/assets/126674348/6df4bf5a-8a6a-4f87-ae8f-07ac2840839f)--- prev: true next: true description: A tutorial on configuring your Unity project for custom enemies. @@ -97,24 +97,24 @@ Enemy Type options: - Normalized Time In Day To Leave: a value in the range [0, 1] showing the percenage of each day for which the enemy is calling a method (e.g. at `0.5`, the daytime enemy runs the method at 4pm) // check pls #### Misc. ingame properties -- Stun Time Multiplier: for how long the enemy can be stunned for. // unsure -- Door Speed Multiplier: for how long the enemy takes to open doors. -- Stun Game Difficulty Multiplier: for how difficult it is to stun the enemy with a zap gun. // pretty sure +- Stun Time Multiplier: (`float`) Multiplier that changes how long an enemy is stunned for based on the default Stun-grenade stun time of 7.5 seconds. +- Door Speed Multiplier: (`float`) Multiplier for how fast the enemy opens doors. +- Stun Game Difficulty Multiplier: (`float`) Multiplier that exponentially increases the difficulty for Zap Gun minigame against the enemy. - Can Be Stunned (`bool`) - Can Die (`bool`) - Destroy On Death: Whether or not the `GameObject` is destroyed upon enemy death. -- Can See Through Fog: Whether the enemy's line of sight gets clamped to a range between 0 and 30 near fog/on foggy area. +- Can See Through Fog: (`bool`) Whether the enemy's line of sight gets clamped to a range between 0 and 30 near fog/on foggy area. #### Vent Properties -- Time To Play Audio: the delay of playing vent audio after the enemy spawns (specific to "inside" enemies only) //unsure about this whole list tbh -- Loudness Multiplier: the volume multiplier for the Vent SFX. -- Override Vent SFX: The audio clip which replaces the vent sound. Leave as `None` to use the default audio sound. (e.g. "kwoosh") -- Hit Body SFX: for when the enemy's body is hit (e.g. "tushhh") -- Hit Enemy Voice SFX: for when the enemy's body is hit (e.g. "aaah") -- Death SFX: for when the enemy dies (e.g. "Aaaah!") -- Stun SFX: for when the enemy is stunned (e.g. "Bzzzzt") +- Time To Play Audio: (`float`) Time it takes to play an audio before/while exiting the vent (specific to `inside` enemies only) //unsure about this one +- Loudness Multiplier: (`float`) the volume multiplier for the Vent SFX. +- Override Vent SFX: (`AudioClip`) The audio clip which replaces the vent sound. Leave as `None` to use the default audio sound. (e.g. "kwoosh") +- Hit Body SFX: (`AudioClip`) For when the enemy's body is hit (e.g. "tushhh") +- Hit Enemy Voice SFX: (`AudioClip`) For when the enemy hits "something" (e.g. "aaah") +- Death SFX: (`AudioClip`) For when the enemy dies (e.g. "Aaaah!") +- Stun SFX: (`AudioClip`) For when the enemy is stunned (e.g. "Bzzzzt") - Misc Animations: Unused -- Audio Clips: the other audio clips you want to use (e.g. footstep sounds e.g. "badoosh.... badoosh..." (loops*1)) +- Audio Clips: (`AudioClip`) The other audio clips you want to use (e.g. footstep sounds e.g. "badoosh.... badoosh..." (loops*1)) *1 Well, technically you would use an `AnimationEvent`, not loops. From e504c7c4d1b7c733bf433f61f8eb03157b943325 Mon Sep 17 00:00:00 2001 From: Xu Xiaolan <126674348+XuuXiao@users.noreply.github.com> Date: Fri, 22 Mar 2024 16:22:16 +0000 Subject: [PATCH 13/14] Removed unused image as requested --- docs/dev/apis/lethallib/custom-enemies/unity-project.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/dev/apis/lethallib/custom-enemies/unity-project.md b/docs/dev/apis/lethallib/custom-enemies/unity-project.md index 5484baa3609..ffd2c001bd3 100644 --- a/docs/dev/apis/lethallib/custom-enemies/unity-project.md +++ b/docs/dev/apis/lethallib/custom-enemies/unity-project.md @@ -1,4 +1,3 @@ -![image](https://github.com/XuuXiao/ModdingWiki/assets/126674348/6df4bf5a-8a6a-4f87-ae8f-07ac2840839f)--- prev: true next: true description: A tutorial on configuring your Unity project for custom enemies. From 7f4f2d31452207d53bb4e69d064e8e2535b73390 Mon Sep 17 00:00:00 2001 From: Ryan Gregory Date: Fri, 22 Mar 2024 12:46:18 -0400 Subject: [PATCH 14/14] Update unity-project.md --- docs/dev/apis/lethallib/custom-enemies/unity-project.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/dev/apis/lethallib/custom-enemies/unity-project.md b/docs/dev/apis/lethallib/custom-enemies/unity-project.md index ffd2c001bd3..0c63053c6c1 100644 --- a/docs/dev/apis/lethallib/custom-enemies/unity-project.md +++ b/docs/dev/apis/lethallib/custom-enemies/unity-project.md @@ -1,3 +1,4 @@ +--- prev: true next: true description: A tutorial on configuring your Unity project for custom enemies.