using Prism; namespace FPSExample { public class FPSPlayer : Entity { public float WalkingSpeed = 10.0F; public float RunSpeed = 20.0F; public float JumpForce = 50.0F; public float MouseSensitivity = 10.0F; public float Distance = 5.0F; private bool m_Colliding = false; private float m_CurrentSpeed; private RigidBodyComponent m_RigidBody; private TransformComponent m_Transform; private TransformComponent m_CameraTransform; private Entity m_CameraEntity; private Vec2 m_LastMousePosition; void OnCreate() { m_Transform = GetComponent(); m_RigidBody = GetComponent(); m_CurrentSpeed = WalkingSpeed; AddCollisionBeginCallback((n) => { m_Colliding = true; }); AddCollisionEndCallback((n) => { m_Colliding = false; }); m_CameraEntity = FindEntityByTag("Camera"); m_CameraTransform = m_CameraEntity.GetComponent(); m_LastMousePosition = Input.GetMousePosition(); Input.SetCursorMode(Input.CursorMode.Locked); } void OnUpdate(float ts) { if (Input.IsKeyPressed(KeyCode.Escape) && Input.GetCursorMode() == Input.CursorMode.Locked) Input.SetCursorMode(Input.CursorMode.Normal); if(Input.IsMouseButtonPressed(Input.MouseButton.Left) && Input.GetCursorMode() == Input.CursorMode.Normal) Input.SetCursorMode(Input.CursorMode.Locked); m_CurrentSpeed = Input.IsKeyPressed(KeyCode.LeftControl) ? RunSpeed : WalkingSpeed; UpdateRotation(ts); UpdateMovement(); UpdateCameraTransform(); } private void UpdateRotation(float ts) { Vec2 currentMousePosition = Input.GetMousePosition(); Vec2 delta = m_LastMousePosition - currentMousePosition; float yRotation = delta.X * MouseSensitivity * ts; float xRotation = delta.Y * MouseSensitivity * ts; m_RigidBody.Rotate(new Vec3(0.0f, yRotation, 0.0f)); if (delta.X != 0 || delta.Y != 0) { m_CameraTransform.Rotation += new Vec3(xRotation, yRotation, 0.0f); } m_CameraTransform.Rotation = new Vec3(Mathf.Clamp(m_CameraTransform.Rotation.X, -89.0f, 89.0f), m_CameraTransform.Rotation.YZ); m_LastMousePosition = currentMousePosition; } Collider[] colliders = new Collider[10]; private void UpdateMovement() { RaycastHit hitInfo; if (Input.IsKeyPressed(KeyCode.H) && Physics.Raycast(m_CameraTransform.Position + (m_CameraTransform.Transform.Forward * 5.0f), m_CameraTransform.Transform.Forward, 20.0f, out hitInfo)) { FindEntityByID(hitInfo.EntityID).GetComponent().Mesh.GetMaterial(0).Set("u_AlbedoColor", new Vec3(1.0f ,0.0f, 0.0f)); } if (Input.IsKeyPressed(KeyCode.I)) { // NOTE: The NonAlloc version of Overlap functions should be used when possible since it doesn't allocate a new array // whenever you call it. The normal versions allocates a brand new array every time. int numColliders = Physics.OverlapBoxNonAlloc(m_Transform.Position, new Vec3(1.0F), colliders); Console.WriteLine("Colliders: {0}", numColliders); // When using NonAlloc it's not safe to use a foreach loop since some of the colliders may not exist for (int i = 0; i < numColliders; i++) { Console.WriteLine(colliders[i]); } } if (Input.IsKeyPressed(KeyCode.W)) m_RigidBody.AddForce(m_Transform.Transform.Forward * m_CurrentSpeed); else if (Input.IsKeyPressed(KeyCode.S)) m_RigidBody.AddForce(m_Transform.Transform.Forward * -m_CurrentSpeed); if (Input.IsKeyPressed(KeyCode.A)) m_RigidBody.AddForce(m_Transform.Transform.Right * -m_CurrentSpeed); else if (Input.IsKeyPressed(KeyCode.D)) m_RigidBody.AddForce(m_Transform.Transform.Right * m_CurrentSpeed); if (Input.IsKeyPressed(KeyCode.Space) && m_Colliding) m_RigidBody.AddForce(Vec3.Up * JumpForce); } private void UpdateCameraTransform(){ Vec3 position = m_Transform.Position; position.Y += 1.5f; m_CameraTransform.Position = position; } } }