public void Spawn(Vector2 position) { for (int j = 0; j < Count; j++) { LockstepNetwork.Instance.SendInput(CommandTag.Spawn, new SpawnCommand { EntityConfigId = RTSSimulator.Instance.EntityDatabase.Entities.IndexOf(Prefab), Position = position }); } }
public void Spawn(Vector2 position) { for (int j = 0; j < Count; j++) { RTSNetworkedSimulation.Instance.Execute(new SpawnCommand { EntityConfigId = EntityDatabase.Entities.IndexOf(Prefab), Position = position }); } }
// Update is called once per frame void Update() { if (cc != null) { BEPUutilities.Vector2 totalMovement = BEPUutilities.Vector2.Zero; if (Input.GetKey(KeyCode.S)) { totalMovement += new BEPUutilities.Vector2(0, 1); } if (Input.GetKey(KeyCode.W)) { totalMovement += new BEPUutilities.Vector2(0, -1); } if (Input.GetKey(KeyCode.A)) { totalMovement += new BEPUutilities.Vector2(-1, 0); } if (Input.GetKey(KeyCode.D)) { totalMovement += new BEPUutilities.Vector2(1, 0); } if (Input.GetKey(KeyCode.Space)) { cc.Jump(); } if (totalMovement == BEPUutilities.Vector2.Zero) { cc.HorizontalMotionConstraint.MovementDirection = BEPUutilities.Vector2.Zero; } else { cc.HorizontalMotionConstraint.MovementDirection = BEPUutilities.Vector2.Normalize(totalMovement); } transform.position = new Vector3(cc.Body.position.X, cc.Body.position.Y, cc.Body.position.Z); } }
public void OnPosition(GameEntity entity, BEPUutilities.Vector2 newPosition) { transform.position = new Vector3((float)newPosition.X, 1, (float)newPosition.Y); }
public bool RayCast(Bone bone, Ray ray, out RayHit hit) { var transform = new RigidTransform(bone.Position, bone.Orientation); //Put the ray into local space. Quaternion conjugate; Quaternion.Conjugate(ref transform.Orientation, out conjugate); Ray localRay; Vector3.Subtract(ref ray.Position, ref transform.Position, out localRay.Position); Quaternion.Transform(ref localRay.Position, ref conjugate, out localRay.Position); Quaternion.Transform(ref ray.Direction, ref conjugate, out localRay.Direction); var halfHeight = bone.HalfHeight; var radius = bone.Radius; //Check for containment. if (localRay.Position.Y >= -halfHeight && localRay.Position.Y <= halfHeight && localRay.Position.X * localRay.Position.X + localRay.Position.Z * localRay.Position.Z <= radius * radius) { //It's inside! hit.T = 0; hit.Location = localRay.Position; hit.Normal = new Vector3(hit.Location.X, 0, hit.Location.Z); float normalLengthSquared = hit.Normal.LengthSquared(); if (normalLengthSquared > 1e-9f) Vector3.Divide(ref hit.Normal, (float)Math.Sqrt(normalLengthSquared), out hit.Normal); else hit.Normal = new Vector3(); //Pull the hit into world space. Quaternion.Transform(ref hit.Normal, ref transform.Orientation, out hit.Normal); RigidTransform.Transform(ref hit.Location, ref transform, out hit.Location); return true; } //Project the ray direction onto the plane where the cylinder is a circle. //The projected ray is then tested against the circle to compute the time of impact. //That time of impact is used to compute the 3d hit location. Vector2 planeDirection = new Vector2(localRay.Direction.X, localRay.Direction.Z); float planeDirectionLengthSquared = planeDirection.LengthSquared(); if (planeDirectionLengthSquared < Toolbox.Epsilon) { //The ray is nearly parallel with the axis. //Skip the cylinder-sides test. We're either inside the cylinder and won't hit the sides, or we're outside //and won't hit the sides. if (localRay.Position.Y > halfHeight) goto upperTest; if (localRay.Position.Y < -halfHeight) goto lowerTest; hit = new RayHit(); return false; } Vector2 planeOrigin = new Vector2(localRay.Position.X, localRay.Position.Z); float dot; Vector2.Dot(ref planeDirection, ref planeOrigin, out dot); float closestToCenterT = -dot / planeDirectionLengthSquared; Vector2 closestPoint; Vector2.Multiply(ref planeDirection, closestToCenterT, out closestPoint); Vector2.Add(ref planeOrigin, ref closestPoint, out closestPoint); //How close does the ray come to the circle? float squaredDistance = closestPoint.LengthSquared(); if (squaredDistance > radius * radius) { //It's too far! The ray cannot possibly hit the capsule. hit = new RayHit(); return false; } //With the squared distance, compute the distance backward along the ray from the closest point on the ray to the axis. float backwardsDistance = radius * (float)Math.Sqrt(1 - squaredDistance / (radius * radius)); float tOffset = backwardsDistance / (float)Math.Sqrt(planeDirectionLengthSquared); hit.T = closestToCenterT - tOffset; //Compute the impact point on the infinite cylinder in 3d local space. Vector3.Multiply(ref localRay.Direction, hit.T, out hit.Location); Vector3.Add(ref hit.Location, ref localRay.Position, out hit.Location); //Is it intersecting the cylindrical portion of the capsule? if (hit.Location.Y <= halfHeight && hit.Location.Y >= -halfHeight) { //Yup! hit.Normal = new Vector3(hit.Location.X, 0, hit.Location.Z); float normalLengthSquared = hit.Normal.LengthSquared(); if (normalLengthSquared > 1e-9f) Vector3.Divide(ref hit.Normal, (float)Math.Sqrt(normalLengthSquared), out hit.Normal); else hit.Normal = new Vector3(); //Pull the hit into world space. Quaternion.Transform(ref hit.Normal, ref transform.Orientation, out hit.Normal); RigidTransform.Transform(ref hit.Location, ref transform, out hit.Location); return true; } if (hit.Location.Y < halfHeight) goto lowerTest; upperTest: //Nope! It may be intersecting the ends of the cylinder though. //We're above the cylinder, so cast a ray against the upper cap. if (localRay.Direction.Y > -1e-9) { //Can't hit the upper cap if the ray isn't pointing down. hit = new RayHit(); return false; } float t = (halfHeight - localRay.Position.Y) / localRay.Direction.Y; Vector3 planeIntersection; Vector3.Multiply(ref localRay.Direction, t, out planeIntersection); Vector3.Add(ref localRay.Position, ref planeIntersection, out planeIntersection); if (planeIntersection.X * planeIntersection.X + planeIntersection.Z * planeIntersection.Z < radius * radius + 1e-9) { //Pull the hit into world space. Quaternion.Transform(ref Toolbox.UpVector, ref transform.Orientation, out hit.Normal); RigidTransform.Transform(ref planeIntersection, ref transform, out hit.Location); hit.T = t; return true; } //No intersection! We can't be hitting the other sphere, so it's over! hit = new RayHit(); return false; lowerTest: //Is it intersecting the bottom cap? if (localRay.Direction.Y < 1e-9) { //Can't hit the bottom cap if the ray isn't pointing up. hit = new RayHit(); return false; } t = (-halfHeight - localRay.Position.Y) / localRay.Direction.Y; Vector3.Multiply(ref localRay.Direction, t, out planeIntersection); Vector3.Add(ref localRay.Position, ref planeIntersection, out planeIntersection); if (planeIntersection.X * planeIntersection.X + planeIntersection.Z * planeIntersection.Z < radius * radius + 1e-9) { //Pull the hit into world space. Quaternion.Transform(ref Toolbox.DownVector, ref transform.Orientation, out hit.Normal); RigidTransform.Transform(ref planeIntersection, ref transform, out hit.Location); hit.T = t; return true; } //No intersection! We can't be hitting the other sphere, so it's over! hit = new RayHit(); return false; }
public static ref BEPUutilities.Vector2 CopyTo(this Vector3 vec, ref BEPUutilities.Vector2 toVec) { toVec.X = vec.x; toVec.Y = -vec.z; return(ref toVec); }