void RenderSlice(float horizontalAngle, out LaserSliceData outSlice) { int Channels = 64; float MaximalVerticalFOV = +0.2f; float MinimalVerticalFOV = -24.9f; float MeasurementRange = 120f; float MeasurementAccuracy = 0.02f; LaserData[] lasers = new LaserData[Channels]; for (int i = 0; i < Channels; i++) { RaycastHit hit; float dist; float verticalAngel = -Mathf.Lerp(MaximalVerticalFOV, MinimalVerticalFOV, (i / (float)(NUM_OF_LASERS - 1))); //Debug.LogFormat("verticalAngel : {0}, Vector: {1}", verticalAngel, Quaternion.Euler(verticalAngel, 0, 0) * Vector3.forward); Vector3 fwd = transform.TransformDirection(Quaternion.Euler(verticalAngel, horizontalAngle, 0) * Vector3.forward); if (Physics.Raycast(transform.position, fwd, out hit, MeasurementRange)) { dist = hit.distance + UnityEngine.Random.Range(-MeasurementAccuracy, MeasurementAccuracy); dist = Mathf.Clamp(dist, 0, MeasurementRange); Debug.DrawLine(transform.position, hit.point, Color.green); Debug.DrawLine(hit.point - Vector3.up * 0.3f, hit.point + Vector3.up * 0.3f, Color.red, 0, false); Debug.DrawLine(hit.point - Vector3.left * 0.3f, hit.point + Vector3.left * 0.3f, Color.red, 0, false); Debug.DrawLine(hit.point - Vector3.forward * 0.3f, hit.point + Vector3.forward * 0.3f, Color.red, 0, false); } else { dist = MeasurementRange; Debug.DrawRay(transform.position, fwd, Color.gray); } //Debug.LogFormat(dist.ToString()); lasers[i] = new LaserData() { distance = dist, }; } LaserSliceData laserSliceData = new LaserSliceData() { RotationalPosition = horizontalAngle, Timestamp = Time.time, Lasers = lasers, }; outSlice = laserSliceData; }
// ---------------------------------------------------------------- // Initialize // ---------------------------------------------------------------- public void Initialize(Room _myRoom, LaserData data) { base.InitializeAsProp(_myRoom, data); if (data.onOffer.durOff > 0) { AddOnOffer(data.onOffer); } //tf_sourceBox.size = data.myRect.size; //sr_body.transform.localPosition = data.myRect.position; //sourceBoxRotation = data.rotation; }
public void Shoot(LaserData data) { //Debug.DrawLine(transform.position, transform.position + transform.forward * 3f, Color.red, 5f); GameObject laserObj = spawner.Spawn(data.laser, transform.position); laserObj.transform.rotation = transform.rotation; Laser laser = laserObj.GetComponent <Laser>(); if (laser != null && data != null) { laser.SetData(data); } }
void RenderSlice(float horizontalAngle, out LaserSliceData outSlice) { LaserData[] lasers = new LaserData[Channels]; for (int i = 0; i < Channels; i++) { float verticalAngel = -Mathf.Lerp(MinimalVerticalFOV, MaximalVerticalFOV, (i / (float)(Channels - 1))); RaycastHit hit; float dist; Vector3 fwd = transform.TransformDirection(Quaternion.Euler(verticalAngel, horizontalAngle, 0) * Vector3.forward); if (Physics.Raycast(transform.position, fwd, out hit, MeasurementRange)) { dist = hit.distance + Random.Range(-MeasurementAccuracy, MeasurementAccuracy); dist = Mathf.Clamp(dist, 0, MeasurementRange); Debug.DrawLine(transform.position, hit.point, Color.green); Debug.DrawLine(hit.point - Vector3.up * 0.3f, hit.point + Vector3.up * 0.3f, Color.red, 0, false); Debug.DrawLine(hit.point - Vector3.left * 0.3f, hit.point + Vector3.left * 0.3f, Color.red, 0, false); Debug.DrawLine(hit.point - Vector3.forward * 0.3f, hit.point + Vector3.forward * 0.3f, Color.red, 0, false); } else { dist = MeasurementRange; } lasers[i] = new LaserData() { distance = dist, }; } LaserSliceData laserSliceData = new LaserSliceData() { RotationalPosition = horizontalAngle, Timestamp = Time.time, Lasers = lasers, }; outSlice = laserSliceData; }
// scanning goes over angles relative to y as axis of rotation, so x = 1, z = 0 it is 90 grads. public static LaserData ScanPoint(Vector3 point) { LaserData data = new LaserData(); for (var i = 0; i < SCANNING_ANGLES; i++) { var angleGrad = 360/SCANNING_ANGLES*i; if (angleGrad >= 360) angleGrad -= 360; var angle = angleGrad*Mathf.PI/180; var directionX = Mathf.Sin(angle); var directionZ = Mathf.Cos(angle); var ray = new Ray() { origin = point, direction = new Vector3(directionX, 0f, directionZ) }; RaycastHit hit; Physics.Raycast(ray, out hit); data[angleGrad] = hit.distance; } return data.Normalize(); }
/// <summary> /// levelDataFile로 지정된 Xml 파일을 읽어와 리스트에 저장합니다. /// </summary> public void LoadXml() { // 리스트 초기화 #region Initialize Lists enemyDataList.Clear(); laserDataList.Clear(); resizeDataList.Clear(); colDataList.Clear(); rotateDataList.Clear(); enlargeDataList.Clear(); moveDataList.Clear(); visibleDataList.Clear(); replacePlayerDataList.Clear(); killDataList.Clear(); #endregion // Xml 불러오기 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(levelDataFile.text); XmlNodeList nodes; #region Add Info nodes = xmlDoc.SelectNodes("CustomLevel/Info"); foreach (XmlNode node in nodes) { infoList.Add(node.SelectSingleNode("LevelName").InnerText); infoList.Add(node.SelectSingleNode("LevelDesigner").InnerText); infoList.Add(node.SelectSingleNode("MusicName").InnerText); infoList.Add(node.SelectSingleNode("Composer").InnerText); } #endregion #region Add EnemySpawn nodes = xmlDoc.SelectNodes("CustomLevel/EnemySpawn"); foreach (XmlNode node in nodes) { try { EnemyData data = new EnemyData( float.Parse(node.SelectSingleNode("ActiveTime").InnerText), int.Parse(node.SelectSingleNode("SpawnDir").InnerText), int.Parse(node.SelectSingleNode("SpawnPos").InnerText), float.Parse(node.SelectSingleNode("Speed").InnerText), float.Parse(node.SelectSingleNode("Velo").InnerText), bool.Parse(node.SelectSingleNode("IsHeart").InnerText), bool.Parse(node.SelectSingleNode("Follow").InnerText) ); enemyDataList.Add(data); } catch (FormatException ex) { Debug.LogError(ex); } } #endregion #region Add LaserSpawn nodes = xmlDoc.SelectNodes("CustomLevel/LaserSpawn"); foreach (XmlNode node in nodes) { try { LaserData data = new LaserData( float.Parse(node.SelectSingleNode("ActiveTime").InnerText), int.Parse(node.SelectSingleNode("SpawnDir").InnerText), int.Parse(node.SelectSingleNode("SpawnPos").InnerText), float.Parse(node.SelectSingleNode("Time").InnerText), bool.Parse(node.SelectSingleNode("Follow").InnerText) ); laserDataList.Add(data); } catch (FormatException ex) { Debug.LogError(ex); } } #endregion #region Add ResizeLevel nodes = xmlDoc.SelectNodes("CustomLevel/ResizeLevel"); foreach (XmlNode node in nodes) { try { ResizeLevelData data = new ResizeLevelData( float.Parse(node.SelectSingleNode("ActiveTime").InnerText), int.Parse(node.SelectSingleNode("Width").InnerText), int.Parse(node.SelectSingleNode("Height").InnerText) ); resizeDataList.Add(data); } catch (FormatException ex) { Debug.LogError(ex); } } #endregion #region Add ColorChange nodes = xmlDoc.SelectNodes("CustomLevel/ColorChange"); foreach (XmlNode node in nodes) { try { ColorData data = new ColorData( (ColorDataList)Enum.Parse(typeof(ColorDataList), node.SelectSingleNode("ColorData").InnerText), float.Parse(node.SelectSingleNode("ActiveTime").InnerText), float.Parse(node.SelectSingleNode("R").InnerText), float.Parse(node.SelectSingleNode("G").InnerText), float.Parse(node.SelectSingleNode("B").InnerText), float.Parse(node.SelectSingleNode("Time").InnerText), (LerpType)Enum.Parse(typeof(LerpType), node.SelectSingleNode("LerpType").InnerText), int.Parse(node.SelectSingleNode("Level").InnerText) ); colDataList.Add(data); } catch (FormatException ex) { Debug.LogError(ex); } } #endregion #region Add RotateLevel nodes = xmlDoc.SelectNodes("CustomLevel/RotateLevel"); foreach (XmlNode node in nodes) { try { RotateLevelData data = new RotateLevelData( float.Parse(node.SelectSingleNode("ActiveTime").InnerText), float.Parse(node.SelectSingleNode("Angle").InnerText), float.Parse(node.SelectSingleNode("Time").InnerText), (LerpType)Enum.Parse(typeof(LerpType), node.SelectSingleNode("LerpType").InnerText), int.Parse(node.SelectSingleNode("Level").InnerText) ); rotateDataList.Add(data); } catch (FormatException ex) { Debug.LogError(ex); } } #endregion #region Add EnlargeLevel nodes = xmlDoc.SelectNodes("CustomLevel/EnlargeLevel"); foreach (XmlNode node in nodes) { try { EnlargeLevelData data = new EnlargeLevelData( float.Parse(node.SelectSingleNode("ActiveTime").InnerText), float.Parse(node.SelectSingleNode("Rate").InnerText), float.Parse(node.SelectSingleNode("Time").InnerText), (LerpType)Enum.Parse(typeof(LerpType), node.SelectSingleNode("LerpType").InnerText), int.Parse(node.SelectSingleNode("Level").InnerText) ); enlargeDataList.Add(data); } catch (FormatException ex) { Debug.LogError(ex); } } #endregion #region Add MoveLevel nodes = xmlDoc.SelectNodes("CustomLevel/MoveLevel"); foreach (XmlNode node in nodes) { try { MoveLevelData data = new MoveLevelData( float.Parse(node.SelectSingleNode("ActiveTime").InnerText), float.Parse(node.SelectSingleNode("X").InnerText), float.Parse(node.SelectSingleNode("Y").InnerText), float.Parse(node.SelectSingleNode("Time").InnerText), (LerpType)Enum.Parse(typeof(LerpType), node.SelectSingleNode("LerpType").InnerText), int.Parse(node.SelectSingleNode("Level").InnerText) ); moveDataList.Add(data); } catch (FormatException ex) { Debug.LogError(ex); } } #endregion #region Add PlayerVisible nodes = xmlDoc.SelectNodes("CustomLevel/PlayerVisible"); foreach (XmlNode node in nodes) { try { PlayerVisibleData data = new PlayerVisibleData( float.Parse(node.SelectSingleNode("ActiveTime").InnerText), bool.Parse(node.SelectSingleNode("Visible").InnerText) ); visibleDataList.Add(data); } catch (FormatException ex) { Debug.LogError(ex); } } #endregion #region Add ReplacePlayer nodes = xmlDoc.SelectNodes("CustomLevel/ReplacePlayer"); foreach (XmlNode node in nodes) { try { ReplacePlayerData data = new ReplacePlayerData( float.Parse(node.SelectSingleNode("ActiveTime").InnerText), int.Parse(node.SelectSingleNode("X").InnerText), int.Parse(node.SelectSingleNode("Y").InnerText) ); replacePlayerDataList.Add(data); } catch (FormatException ex) { Debug.LogError(ex); } } #endregion #region Add KillEntity nodes = xmlDoc.SelectNodes("CustomLevel/KillEntity"); foreach (XmlNode node in nodes) { try { KillEntityData data = new KillEntityData( float.Parse(node.SelectSingleNode("ActiveTime").InnerText), node.SelectSingleNode("Tag").InnerText ); killDataList.Add(data); } catch (FormatException ex) { Debug.LogError(ex); } } #endregion }
static private List <string> GetPropPropertyNamesToSave(PropData propData) { List <string> ps = new List <string>(); // property names! // YES travelMind?? Add that! if (propData.travelMind.IsUsed) { ps.Add("travelMind"); } // NO TravelMind?? Add pos! else { ps.Add("pos"); } if (!Mathf.Approximately(propData.rotation, 0)) { ps.Add("rotation"); } // BaseGroundData? if (propData is BaseGroundData) { ps.Add("size"); BaseGroundData d = propData as BaseGroundData; if (!d.mayPlayerEat) { ps.Add("mayPlayerEat"); } if (d.isPlayerRespawn) { ps.Add("isPlayerRespawn"); } if (d.preventHappyHop) { ps.Add("preventHappyHop"); } } Type type = propData.GetType(); if (type == typeof(BatteryData)) { } else if (type == typeof(BuzzsawData)) { ps.Add("size"); } else if (type == typeof(CameraBoundsData)) { ps.Add("size"); } else if (type == typeof(CharBarrelData)) { ps.Add("otherCharName"); } else if (type == typeof(CharUnlockOrbData)) { ps.Add("myCharName"); } else if (type == typeof(CrateData)) { ps.Add("hitsUntilBreak"); ps.Add("numCoinsInMe"); } else if (type == typeof(GateData)) { ps.Add("channelID"); } else if (type == typeof(GateButtonData)) { ps.Add("channelID"); } else if (type == typeof(GemData)) { ps.Add("type"); } else if (type == typeof(InfoSignData)) { ps.Add("myText"); } else if (type == typeof(LiftData)) { ps.Add("size"); ps.Add("strength"); } else if (type == typeof(PlayerStartData)) { } else if (type == typeof(ProgressGateData)) { ps.Add("numSnacksReq"); } else if (type == typeof(RoomDoorData)) { ps.Add("myID"); ps.Add("worldToIndex"); ps.Add("roomToKey"); ps.Add("doorToID"); } else if (type == typeof(SnackData)) { ps.Add("playerType"); } else if (type == typeof(VeilData)) { ps.Add("size"); } // Enemies else if (type == typeof(DweebData)) { ps.Add("speed"); } // Props with optional params else if (type == typeof(TurretData)) { TurretData d = propData as TurretData; ps.Add("interval"); ps.Add("speed"); if (d.startOffset > 0) { ps.Add("startOffset"); } } else if (type == typeof(SpikesData)) { SpikesData d = propData as SpikesData; ps.Add("size"); if (d.onOffer.IsUsed) { ps.Add("onOffer"); } } else if (type == typeof(LaserData)) { LaserData d = propData as LaserData; if (d.onOffer.IsUsed) { ps.Add("onOffer"); } } else if (type == typeof(DispGroundData)) { DispGroundData d = propData as DispGroundData; ps.Add("doRegen"); if (d.regenTime != DispGround.RegenTimeDefault) { ps.Add("regenTime"); } if (d.dieFromBounce) { ps.Add("dieFromBounce"); } if (d.dieFromPlayerLeave) { ps.Add("dieFromPlayerLeave"); } if (d.dieFromVel) { ps.Add("dieFromVel"); } } else if (type == typeof(GroundData)) { GroundData d = propData as GroundData; if (d.isBouncy) { ps.Add("isBouncy"); } if (!d.mayBounce) { ps.Add("mayBounce"); } if (!d.doRechargePlayer) { ps.Add("doRechargePlayer"); } } else if (type == typeof(PlatformData)) { PlatformData d = propData as PlatformData; if (!d.canDropThru) { ps.Add("canDropThru"); } } else if (type == typeof(ToggleGroundData)) { ps.Add("startsOn"); ps.Add("togFromContact"); ps.Add("togFromAction"); } else { Debug.LogWarning("Prop in Room not recognized for serialization: " + type); } return(ps); }
public void SetLaserData(LaserData value) { laserData = value; }
public Laser(EnemyAttackDataBase data, Enemy enemy) { _Data = data as LaserData; _Enemy = enemy; _CompleteObserver = new Subject <Unit> (); }
public Laser(GameManager manager, GameObject gameObject, T parent, LaserData data) : base(manager, gameObject) { this.parent = parent; this.data = data; }
// Update is called once per frame void Update() { if (timer > 0) { timer -= Time.deltaTime; } else { if (laserQueue.Count > 0) { LaserData currentData = laserQueue.Dequeue(); Laser currentLaser = Instantiate(laserPrefab); //currentLaser.playerPos = playerPos; currentLaser.moveDirection = currentData.moveDirection; if (currentLaser.moveDirection == 0 || currentLaser.moveDirection == 1) { currentLaser.orientation = 1; currentLaser.transform.rotation = Quaternion.Euler(Vector3.forward * 90); } else if (currentLaser.moveDirection == 2 || currentLaser.moveDirection == 3) { currentLaser.orientation = 0; } switch (currentLaser.moveDirection) { case 0: currentLaser.orientation = 1; currentLaser.transform.position = bottomSpawnLocation.position; currentLaser.transform.rotation = Quaternion.Euler(Vector3.forward * 90); break; case 1: currentLaser.orientation = 1; currentLaser.transform.position = topSpawnLocation.position; currentLaser.transform.rotation = Quaternion.Euler(Vector3.forward * 90); break; case 2: currentLaser.orientation = 0; currentLaser.transform.position = rightSpawnLocation.position; break; case 3: currentLaser.orientation = 0; currentLaser.transform.position = leftSpawnLocation.position; break; } currentLaser.speed = currentData.speed; timer = currentData.time; } else { player.GetComponent <LevelsComplete>().RoomComplete(); foreach (GameObject i in stuffToDisable) { i.SetActive(false); } } } }