public void TryLaserShot() { float LaserLen = 10f; if (LasersCharges.x > 0) { LasersCharges.x--; AsteroidsGame.current.UpdateLaserCounter(); var up = logicobj.up; foreach (var item in Engine.FindObjectsOfType <FastPhysics>()) { if (!FastPhysics.CrossArray(item.logicobj.tags, tagsblacklist)) { //Расстояние до лазера от объекта это длина его перпендикуляра если корабль смотрит в сторону объекта var ip = item.position; if (Vector2.Distance(up + position, ip) < Vector2.Distance(position, ip))//Если корабль смотрит в сторону объекта { Vector2 cross = PerpPoint(ip - position, up); if (cross.magnitude < item.Radius && Vector2.Distance(ip - cross, position) < LaserLen)//Длина перепендикуляра { AsteroidsGenerator.Crush(item.logicobj, true); } } } } var laser = LogicalObject.Create() .AddPart(new PolyRenderer(new Vector2[] { new Vector2(0, 0.5f), new Vector2(0, LaserLen) }, Color.red)); laser.position = position; laser.angle = angle; Destroy(laser, 0.1f); } }
public override void Update() { ShotCooldown.Update(Time.deltaTime * FastPhysics.TimeScale); LaserCooldown.Update(Time.deltaTime * FastPhysics.TimeScale); FastPhysics.CheckCollisions(FastPhysics, tagsblacklist, (item) => { //TODO audio AsteroidsGenerator.Crush(item.logicobj); OnDamage(); }); }
public override void Update() { FastPhysics.CheckCollisions(FastPhysics, tagsblacklist, (item) => { //TODO audio AsteroidsGenerator.Crush(item.logicobj); Destroy(); }); lifetime -= Time.deltaTime * FastPhysics.TimeScale; if (lifetime <= 0) { Destroy(); } }
public override void KeyInput(KeyCode key) { if (Input.anyKey && FastPhysics.TimeScale != 0) { if (key == KeyCode.W) { FastPhysics.AddForce(logicobj.up * Time.deltaTime * Speed); } if (Input.GetKeyDown(KeyCode.Space) || Input.GetKeyDown(KeyCode.Mouse0))//Shot { sl.Shot(); } if (Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.Mouse1))//Laser { sl.TryLaserShot(); } } }
//Collisions public static bool CheckCollisions(FastPhysics who, IEnumerable <string> tagsblacklist, UnityAction <FastPhysics> onCollision) { Vector2 pos = who.position; float r = who.Radius; bool faced = false; foreach (var item in Engine.FindObjectsOfType <FastPhysics>()) { if (!CrossArray(tagsblacklist, item.logicobj.tags)) { if (Vector2.Distance(item.position, pos) < item.Radius + r) { onCollision(item); faced = true; } } } return(faced); }