Files
Project-M/Assets/Synty/PolygonDog/Scripts/POLYGON_DogAnimationController.cs
kronic 5a59d8e14f Add Synty asset packs (enemies + environment/FX/UI) via Git LFS
14 newly-imported Synty Polygon packs (~2.46 GB; FBX/PNG/textures stored in
Git LFS per .gitattributes). Enemy-grade characters: Werewolf, Kaiju,
FantasyHeroCharacters, Vikings, Western, HorrorCarnival, Dog. Environment:
Nature, NatureBiomes, PNB_Core, FantasyKingdom. UI/icons: Icons,
InterfaceCore, InterfaceSciFiSoldierHUD.

Werewolf + Kaiju back the DR-023 animated enemies; the rest are cataloged
for future work in Docs/Vault/06_Roadmap/Synty_Asset_Inventory.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 23:28:47 -07:00

473 lines
16 KiB
C#

/*
* POLYGON DOG ANIMATION SCRIPT
* DESCRIPTION: This script demonstrates the range of animations and Prefabs included in
* Polygon Dog which can be customized for the users preference. Please attach this to the
* Dog.Prefab asset then customize the keys for the particular animations.
*
* PLEASE NOTE: This script is intended for demonstration purposes and user customization or
* third party animation plugins will be required for further animation options.
*
*/
using System.Collections;
using UnityEngine;
public class POLYGON_DogAnimationController : MonoBehaviour
{
public enum DogTypeList
{
Coyote,
Dalmatian,
DalmatianCollar,
Doberman,
DobermanCollar,
Fox,
GermanShepherd,
GermanShepherdCollar,
GoldenRetriever,
GoldenRetrieverCollar,
DogGreyhound,
GreyhoundCollar,
HellHound,
Husky,
HuskyCollar,
Labrador,
LabradorCollar,
Pointer,
PointerCollar,
Ridgeback,
RidgebackCollar,
Robot,
Scifi,
Shiba,
Shiba_Collar,
Wolf,
ZombieDoberman,
ZombieGermanShepherd
};
public bool DisplayUI = true; // Toggle displaying UI
private GameObject DogObject;
Transform[] children;
[Header("Action Keys")]
public KeyCode Attack = KeyCode.Mouse0; // Mouse Left-Click Attack
public KeyCode secondAttack = KeyCode.Mouse1; // Mouse Right-Click Attack
public KeyCode forward = KeyCode.W; // Move forward
public KeyCode backward = KeyCode.S; // Move backward
public KeyCode left = KeyCode.A; // Move left
public KeyCode right = KeyCode.D; // Move left
public KeyCode action = KeyCode.F; // action
public KeyCode jump = KeyCode.Space; // Jump
public KeyCode run = KeyCode.LeftShift; // Run
public KeyCode sit = KeyCode.LeftControl; // Sit
public KeyCode sleep = KeyCode.Q; // Sleep
public KeyCode ExitPlaymode = KeyCode.Escape; // Escape playmode
public KeyCode Death = KeyCode.X; // Death
public KeyCode Reset = KeyCode.R; // Reset dog
[Header("Custom Actions")]
public KeyCode action1 = KeyCode.Alpha1;
public KeyCode action2 = KeyCode.Alpha2;
public KeyCode action3 = KeyCode.Alpha3;
public KeyCode action4 = KeyCode.Alpha4;
public KeyCode action5 = KeyCode.Alpha5;
public KeyCode action6 = KeyCode.Alpha6;
public KeyCode action7 = KeyCode.Alpha7;
public KeyCode action8 = KeyCode.Alpha8;
public KeyCode action9 = KeyCode.Alpha9;
public KeyCode action10 = KeyCode.Alpha0;
public KeyCode action11 = KeyCode.F1;
public KeyCode action12 = KeyCode.F2;
public KeyCode action13 = KeyCode.F3;
static private KeyCode[] dogKeyCodes; // Keycode array for assigned keys
static private string[] dogLabels;
static private string[] DogNewTypes; // Dog Types
Animator dogAnim;// Animator for the assigned dog
bool dogActionEnabled;
public float timeRemaining = 1.0f;
private int countDown = 1;
bool Movement_f;
bool death_b = false;
bool Sleep_b = false;
bool Sit_b = false;
private float w_movement = 0.0f; // Run value
public float acceleration = 1.0f;
public float decelleration = 1.0f;
private float maxWalk = 0.5f;
private float maxRun = 1.0f;
private float currentSpeed;
private Transform getDogName;
private GUIStyle guiStyle = new GUIStyle();
[Header("Particle FX")]
public ParticleSystem poopFX;
public ParticleSystem dirtFX;
public ParticleSystem peeFX;
public ParticleSystem waterFX;
private Vector3 newSpawn = new Vector3();
public Transform fxTransform;
public Transform fxTail;
void Start() // On start store dogKeyCodes
{
dogAnim = GetComponent<Animator>(); // Get the animation component
currentSpeed = 0.0f;
DogNewTypes = new string[]
{
"Coyote",
"Dalmatian",
"DalmatianCollar",
"Doberman",
"DobermanCollar",
"Fox",
"GermanShepherd",
"GermanShepherdCollar",
"GoldenRetriever",
"GoldenRetrieverCollar",
"DogGreyhound",
"GreyhoundCollar",
"HellHound",
"Husky",
"HuskyCollar",
"Labrador",
"LabradorCollar",
"Pointer",
"PointerCollar",
"Ridgeback",
"RidgebackCollar",
"Robot",
"Scifi",
"Shiba",
"Shiba_Collar",
"Wolf",
"ZombieDoberman",
"ZombieGermanShepherd"
};
dogKeyCodes = new KeyCode[]
{
Attack,
secondAttack,
forward,
backward,
left,
right,
action,
jump,
run,
sit,
sleep,
ExitPlaymode,
Death,
Reset,
action1,
action2,
action3,
action4,
action5,
action6,
action7,
action8,
action9,
action10,
action11,
action12,
action13
};
dogLabels = new string[] // Labels for UI
{
"Attack: ",
"Second Attack: ",
"Forward: ",
"Backward: ",
"Left: ",
"Right: ",
"Action: ",
"Jump: ",
"Run: ",
"Sit: ",
"Sleep: ",
"Exit Playmode: ",
"Death: ",
"Reset: ",
"Action 1: ",
"Action 2: ",
"Action 3: ",
"Action 4: ",
"Action 5: ",
"Action 6: ",
"Action 7: ",
"Action 8: ",
"Action 9: ",
"Action 10: ",
"Action 11: ",
"Action 12: ",
"Action 13: "
};
guiStyle.fontSize = 18;
guiStyle.normal.textColor = Color.black;
children = GetComponentsInChildren<Transform>();
for (int x = 0; x < children.Length; x++) // Search for dog names
{
if (children[x].name.Contains("Dogs"))
{
getDogName = children[x];
}
}
newSpawn = new Vector3(this.transform.position.x, this.transform.position.y, this.transform.position.z);
}
IEnumerator DogActions(int actionType) // Dog action coroutine
{
dogActionEnabled = true; // Enable the dog animation flag
dogAnim.SetInteger("ActionType_int", actionType); // Enable Animation
yield return new WaitForSeconds(countDown); // Countdown
dogAnim.SetInteger("ActionType_int", 0); // Disable animation
dogActionEnabled = false; // Disable the dog animation flag
}
void OnGUI()
{
if(DisplayUI) // Display Dog keycodes on UI
{
GUI.backgroundColor = Color.yellow;
for (int i = 0; i < dogKeyCodes.Length; i++)
{
GUI.Label(new Rect(10, 10 + (i * 30), 400, 30), dogLabels[i] + " " + dogKeyCodes[i].ToString(), guiStyle);
}
}
}
void Update()
{
bool attackMode = Input.GetKey(dogKeyCodes[0]); // Get the current keycodes assigned by user
bool secondAttack = Input.GetKey(dogKeyCodes[1]);
bool walkPressed = Input.GetKey(dogKeyCodes[2]);
bool turnBack = Input.GetKey(dogKeyCodes[3]);
bool leftTurn = Input.GetKey(dogKeyCodes[4]);
bool rightTurn = Input.GetKey(dogKeyCodes[5]);
bool randActionPressed = Input.GetKeyDown(dogKeyCodes[6]);
bool jumpPressed = Input.GetKeyDown(dogKeyCodes[7]);
bool runPressed = Input.GetKey(dogKeyCodes[8]);
bool sitPressed = Input.GetKeyDown(dogKeyCodes[9]);
bool sleepPressed = Input.GetKeyDown(dogKeyCodes[10]);
bool exitPressed = Input.GetKeyDown(dogKeyCodes[11]);
bool deathPressed = Input.GetKeyDown(dogKeyCodes[12]);
bool resetPressed = Input.GetKeyDown(dogKeyCodes[13]);
bool a1Pressed = Input.GetKey(dogKeyCodes[14]);
bool a2Pressed = Input.GetKey(dogKeyCodes[15]);
bool a3Pressed = Input.GetKey(dogKeyCodes[16]);
bool a4Pressed = Input.GetKey(dogKeyCodes[17]);
bool a5Pressed = Input.GetKey(dogKeyCodes[18]);
bool a6Pressed = Input.GetKey(dogKeyCodes[19]);
bool a7Pressed = Input.GetKey(dogKeyCodes[20]);
bool a8Pressed = Input.GetKey(dogKeyCodes[21]);
bool a9Pressed = Input.GetKey(dogKeyCodes[22]);
bool a10Pressed = Input.GetKey(dogKeyCodes[23]);
bool a11Pressed = Input.GetKey(dogKeyCodes[24]);
bool a12Pressed = Input.GetKey(dogKeyCodes[25]);
bool a13Pressed = Input.GetKey(dogKeyCodes[26]);
if (attackMode)
{
dogAnim.SetBool("AttackReady_b", true);
}
else
{
dogAnim.SetBool("AttackReady_b", false);
}
if (secondAttack)
{
dogAnim.SetInteger("AttackType_int", 2);
}
else
{
dogAnim.SetInteger("AttackType_int", 0);
}
if (randActionPressed)
{
float currentSpeed = a1Pressed ? 1 : maxWalk;
dogAnim.SetInteger("ActionType_int", Random.Range(0, 13));
}
if (runPressed)
{
currentSpeed = maxRun;
}
if (!runPressed)
{
currentSpeed = maxWalk;
}
if (walkPressed && (w_movement < currentSpeed)) // If walking
{
w_movement += Time.deltaTime * acceleration;
}
if (walkPressed && !runPressed && w_movement > currentSpeed) // Slow down
{
w_movement -= Time.deltaTime * decelleration;
}
if (!walkPressed && w_movement > 0.0f) // If no longer walking
{
w_movement -= Time.deltaTime * decelleration;
}
if (leftTurn)
{
if (w_movement > 0.25 && w_movement < 0.75)
{
transform.Rotate(Vector3.up * Time.deltaTime * -45, Space.Self);
}
if (w_movement > 0.75)
{
transform.Rotate(Vector3.up * Time.deltaTime * -65, Space.Self);
}
if (w_movement < 0.25)
{
dogAnim.SetInteger("TurnAngle_int", -90);
}
}
else if (rightTurn)
{
if (w_movement > 0.25 && w_movement < 0.75)
{
transform.Rotate(-Vector3.down * Time.deltaTime * 45, Space.Self);
}
if (w_movement > 0.75)
{
transform.Rotate(-Vector3.down * Time.deltaTime * 65, Space.Self);
}
if (w_movement < 0.25)
{
dogAnim.SetInteger("TurnAngle_int", 90);
}
}
else if (turnBack)
{
dogAnim.SetInteger("TurnAngle_int", 180);
}
else
{
dogAnim.SetInteger("TurnAngle_int", 0);
}
if (randActionPressed)
{
StartCoroutine(DogActions(Random.Range(1, 13)));
}
if (jumpPressed)
{
dogAnim.SetTrigger("Jump_tr");
}
if (sitPressed) // Sit
{
if (Sit_b == false)
{
Sit_b = true;
}
else if (Sit_b == true)
{
Sit_b = false;
}
dogAnim.SetBool("Sit_b", Sit_b); // Set sit animation
}
if (sleepPressed) // Sleep
{
if (Sleep_b == false)
{
Sleep_b = true;
}
else if (Sleep_b == true)
{
Sleep_b = false;
}
dogAnim.SetBool("Sleep_b", Sleep_b); // Set sleep animation
}
if (exitPressed)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#elif UNITY_WEBPLAYER
Application.OpenURL(webplayerQuitURL);
#else
Application.Quit();
#endif
}
if (deathPressed)
{
dogAnim.SetBool("Death_b", true); // Kill the dog
}
if (resetPressed)
{
dogAnim.Rebind();
dogAnim.Update(0f);
}
if (a1Pressed && !dogActionEnabled)
{
StartCoroutine(DogActions(1));
}
if (a2Pressed && !dogActionEnabled)
{
StartCoroutine(DogActions(2));
}
if (a3Pressed && !dogActionEnabled)
{
StartCoroutine(DogActions(3));
}
if (a4Pressed && !dogActionEnabled)
{
StartCoroutine(DogActions(4));
if(!Sit_b)
{
ParticleSystem go = Instantiate(dirtFX, new Vector3(this.transform.position.x, fxTransform.transform.position.y, fxTransform.transform.position.z), this.transform.rotation);
go.transform.SetParent(fxTransform);
go.transform.localPosition = new Vector3(go.transform.localPosition.x, go.transform.localPosition.y, go.transform.localPosition.z + 0.3f);
}
}
if (a5Pressed && !dogActionEnabled)
{
StartCoroutine(DogActions(5));
}
if (a6Pressed && !dogActionEnabled)
{
StartCoroutine(DogActions(6));
}
if (a7Pressed && !dogActionEnabled)
{
StartCoroutine(DogActions(7));
}
if (a8Pressed && !dogActionEnabled)
{
StartCoroutine(DogActions(8));
if(!Sit_b)
{
ParticleSystem go = Instantiate(peeFX, new Vector3(this.transform.position.x, fxTransform.transform.position.y + 0.5f, fxTransform.transform.position.z - 0f), this.transform.rotation);
go.transform.SetParent(fxTransform);
go.transform.localPosition = new Vector3(go.transform.localPosition.x, go.transform.localPosition.y, go.transform.localPosition.z - 0.2f);
go.transform.localRotation = Quaternion.Euler(0, -45, 0);
}
}
if (a9Pressed && !dogActionEnabled)
{
StartCoroutine(DogActions(9));
if(!Sit_b)
{
ParticleSystem go = Instantiate(poopFX, new Vector3(this.transform.position.x, fxTransform.transform.position.y + 0.5f, fxTransform.transform.position.z - 0f), this.transform.rotation);
go.transform.SetParent(fxTransform);
go.transform.localPosition = new Vector3(go.transform.localPosition.x, go.transform.localPosition.y, go.transform.localPosition.z - 0.35f);
}
}
if (a10Pressed && !dogActionEnabled)
{
StartCoroutine(DogActions(10));
if(!Sit_b)
{
ParticleSystem go = Instantiate(waterFX, new Vector3(this.transform.position.x, fxTransform.transform.position.y + 0.5f, fxTransform.transform.position.z - 0f), this.transform.rotation);
go.transform.SetParent(fxTransform);
go.transform.localPosition = new Vector3(go.transform.localPosition.x, go.transform.localPosition.y - 0.0f, go.transform.localPosition.z);
go.gameObject.transform.GetChild(0).transform.position = new Vector3(fxTail.transform.position.x, fxTail.transform.position.y, fxTail.transform.position.z);
}
}
if (a11Pressed && !dogActionEnabled)
{
StartCoroutine(DogActions(11));
}
if (a12Pressed && !dogActionEnabled)
{
StartCoroutine(DogActions(12));
}
if (a13Pressed && !dogActionEnabled)
{
StartCoroutine(DogActions(13));
}
dogAnim.SetTrigger("Blink_tr"); // Blink will continue unless asleep or dead
dogAnim.SetFloat("Movement_f", w_movement); // Set movement speed for all required parameters
}
}