
VR Time-Control Shooter Demo
VR Time-Control Shooter Demo
VR Time-Control Shooter Demo
BACKGROUND
Designed a Superhot-inspired time-scaling mechanic that matches enemy speed to player movement.
Built stylized environments with baked global illumination, real-time lighting, and post-processing.
VR gunplay and object-throwing interactions.
INTERACTION WAYS
INTERACTION WAYS
The faster the player moves, the faster enemies accelerate
Combat supports both gunplay and physics-based object throwin
Sound effects feedback
DEVELOP TOOLS
DEVELOP TOOLS
Unity
Maya
C# Programming


01 Pick up weapons
01 Pick up weapons
01 Pick up weapons


02 Shoot long-range enemies
02 Shoot long-range enemies
02 Shoot long-range enemies


03 Attack close-range enemies with a hammer
03 Attack close-range enemies
with a hammer
03 Attack close-range enemies
with a hammer


04 Combat mirror real-world actions
04 Combat mirror real-world
actions
04 Combat mirror real-world
actions

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UIElements; public class AgentAnimation : MonoBehaviour { public static Animator agentAnimator; public GameObject player; float disBetweenAgentPlayer; static public bool isDead = false; Vector3 enemyPos; public float speed = 1; void Start() { agentAnimator = GetComponent<Animator>(); } void Update() { if (isDead == false) { Vector3 direction = player.transform.position - transform.position; gameObject.transform.rotation = Quaternion.LookRotation(direction); disBetweenAgentPlayer = Vector3.Distance(transform.position, player.transform.position); if (disBetweenAgentPlayer > 10) { agentAnimator.SetBool("isWalking", false); agentAnimator.SetBool("isIdleing", true); agentAnimator.SetBool("isAttacking", false); Debug.Log("idle" + this.gameObject.name +" distance to player is:" +disBetweenAgentPlayer ); } else if (disBetweenAgentPlayer > 1 && disBetweenAgentPlayer <= 10) { // transform.position = Vector3.MoveTowards(transform.position, player.transform.position, speed * Time.deltaTime); // enemyPos = Vector3.MoveTowards(transform.position, player.transform.position, speed * Time.deltaTime); // enemyPos.y = 0; agentAnimator.SetBool("isWalking", true); agentAnimator.SetBool("isAttacking", false); Debug.Log("walking" + this.gameObject.name +" distance to player is:" +disBetweenAgentPlayer ); } else { agentAnimator.SetBool("isWalking", false); agentAnimator.SetBool("isIdleing", true); float dotProduct = Vector3.Dot(Camera.main.transform.forward, transform.forward); // Debug.Log("dotProduct" + dotProduct); if (dotProduct < -0.8f) { agentAnimator.SetBool("isAttacking", true); agentAnimator.SetBool("isIdleing", false); } else { agentAnimator.SetBool("isAttacking", false); agentAnimator.SetBool("isIdleing", true); } } } } }