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;
    }
Esempio n. 2
0
    // ----------------------------------------------------------------
    //  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;
    }
Esempio n. 3
0
        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();
        }
Esempio n. 6
0
    /// <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
    }
Esempio n. 7
0
    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);
    }
Esempio n. 8
0
 public void SetLaserData(LaserData value)
 {
     laserData = value;
 }
Esempio n. 9
0
 public Laser(EnemyAttackDataBase data, Enemy enemy)
 {
     _Data             = data as LaserData;
     _Enemy            = enemy;
     _CompleteObserver = new Subject <Unit> ();
 }
Esempio n. 10
0
 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);
                }
            }
        }
    }