As a 2D technical animator and developer, setting up clean, modular sprite hierarchies for combat-heavy side-scrollers can consume weeks of setup time before gameplay feels right. The Knight vs Undead - Game Sprites package addresses this exact hurdle by providing an asset set tailored for rapid development and clean runtime integration within Unity's modern 2D pipeline.
Architecturally, this package delivers high-resolution PNG sprite sheets split systematically across character states and environmental elements. Rather than locking you into rigid monolithic atlases, the modular construction lets you integrate sprites directly into Unity's Sprite Library and Sprite Resolver components. In my experience, this separation of source art from state logic allows you to set up flexible Mecanim state machines once and reuse them seamlessly across multiple unit types.
Whether you rely on the built-in 2D Renderer or stick to the legacy Built-in Render Pipeline, the structural layout of these sprites makes sorting layer management and colliders straightforward to set up.
The asset isn't just a collection of drawings; it is organized to align with standard Unity 2D workflows. Here is the key takeaway: the clean separation of frame sequences makes setting up Animation Clips and Mecanim State Machines remarkably fast.
Honestly, the visual style and technical architecture of this asset pack make it adaptable to several side-scrolling and top-down project types:
Integrating these characters into a responsive, physics-driven character controller requires standardizing frame timing and animation triggers. Below is a practical step-by-step setup process along with a lightweight production controller script.
Upon importing the asset, select your sprite sheets in the Project window and set the Texture Type to Sprite (2D and UI). Ensure the Sprite Mode is set to Multiple and open the Sprite Editor. Slice the assets by cell count or grid size, and verify that the Pivot is anchored consistently to Bottom Center across all attack and locomotion frames.
Create an Animator Controller and define parameters such as Speed (Float), IsGrounded (Bool), Attack (Trigger), and Die (Trigger). Map transitions using exit times primarily for attack and hurt states, while keeping locomotion transitions responsive with zero exit time.
Attach the following script to your unit GameObject (e.g., the Knight or Skeletal Undead). It handles locomotion physics while updating the Animator parameters cleanly.
using UnityEngine;
[RequireComponent(typeof(Rigidbody2D))]
[RequireComponent(typeof(Animator))]
public class Simple2DCharacterController : MonoBehaviour
{
[Header("Locomotion Settings")]
[SerializeField] private float moveSpeed = 5.0f;
[SerializeField] private float jumpForce = 8.0f;
[SerializeField] private Transform groundCheck;
[SerializeField] private LayerMask groundLayer;
private Rigidbody2D rb;
private Animator animator;
private bool isGrounded;
private bool isFacingRight = true;
// Animator Parameter Hashes for Performance
private static readonly int SpeedHash = Animator.StringToHash("Speed");
private static readonly int IsGroundedHash = Animator.StringToHash("IsGrounded");
private static readonly int AttackHash = Animator.StringToHash("Attack");
private void Awake()
{
rb = GetComponent();
animator = GetComponent();
}
private void Update()
{
float moveInput = Input.GetAxisRaw("Horizontal");
// Ground Check
if (groundCheck != null)
{
isGrounded = Physics2D.OverlapCircle(groundCheck.position, 0.2f, groundLayer);
}
// Apply movement physics
rb.velocity = new Vector2(moveInput * moveSpeed, rb.velocity.y);
// Update Animator state
animator.SetFloat(SpeedHash, Mathf.Abs(moveInput));
animator.SetBool(IsGroundedHash, isGrounded);
// Handle Jump
if (Input.GetButtonDown("Jump") && isGrounded)
{
rb.velocity = new Vector2(rb.velocity.x, jumpForce);
}
// Handle Combat Trigger
if (Input.GetButtonDown("Fire1"))
{
animator.SetTrigger(AttackHash);
}
// Character flipping logic
if (moveInput > 0 && !isFacingRight) Flip();
else if (moveInput < 0 && isFacingRight) Flip();
}
private void Flip()
{
isFacingRight = !isFacingRight;
Vector3 currentScale = transform.localScale;
currentScale.x *= -1;
transform.localScale = currentScale;
}
}
| Category | 2D / Characters |
|---|---|
| Latest Version | v1.0 |
| File Size | 21.91 MB |
| Added to Platform | February 10, 2026 |
| Views | 1 views |
| Downloads | 0 downloads |
| Favourites | 0 favourites |
| Issue with Package? | Report Broken Link → |