Exemplo n.º 1
0
    public bool reserveaction(UnitAction.act dest)
    {
        if (dest == null)
        {
            return(false);
        }

        ract.Add(dest);
        return(true);
    }
Exemplo n.º 2
0
    private bool makedecision()
    {
        candidates.AddRange(makedecisions(gatherinfo()));

        if (candidates.Count <= 0)
        {
            return(false);
        }

        switch (type)
        {
        case normalunit:
        {
            //우선도
            priority p = new priority();
            foreach (UnitAction.act c in candidates)
            {
                switch (c.type)
                {
                case "useweapon":
                {
                    p.add("unitact", c, 3);
                }
                break;

                case "movedest":
                {
                    p.add("unitact", c, 2);
                }
                break;


                default:
                {
                    p.add("unitact", c, 1);
                }
                break;
                }
            }

            decision = (UnitAction.act)p.getrandom_priority().msg;
            Debug.Log("Decision set");
        }
        break;

        case building:
        {
        }
        break;
        }

        candidates.Clear();

        return(true);
    }
Exemplo n.º 3
0
    private bool normalunit_decision(information[] info, List <UnitAction.act> dest) //우선은 이렇게 하드코딩을 하고 나중에 뭔가 작성할 수 있는 스크립트 시스템을 짜는걸로..
    {
        if (info == null || dest == null)
        {
            return(false);
        }

        Debug.Log("normalunit_decision started");

        //정보 처리 -> 처리된 정보를 바탕으로 action을 생성하여 dest에 추가
        List <GameObject> enemylist = new List <GameObject>();

        foreach (information i in info)
        {
            switch (i.type)
            {
            case "Unitinfo":
            {
                object o = i.find("gameobject");
                if (o == null)
                {
                    continue;
                }
                else if (o.GetType().Name != "GameObject")
                {
                    continue;
                }

                GameObject gobj = (GameObject)o;
                Unit       ui   = gobj.GetComponent <Unit>();
                if (ui == null)
                {
                    continue;
                }

                if (ui.team != uinfo.team)         //팀이 다르면
                {
                    enemylist.Add(gobj);
                    Debug.Log("enemylist added");
                }
            }
            break;

            case "attackinfo":     //적의 총알 등의 공격
            {
            }
            break;

            case "damageinfo":     //피해를 입었을 때의 정보
            {
            }
            break;
            }
        }

        //normalunit의 행동 리스트 : 적이 있을경우 공격 및 추적, 공격받았을 경우 공격자 추적, 범위 밖이라면 공격자 쪽으로 이동,


        //먼저 공격할 적을 추림
        //이미 공격중인 타겟이 건재하면 앵간해선 안 바꾸도록
        //근데 적 타겟이 건물이거나 할떄 적 유닛이 있으면 그쪽으로 바꾸는것도 좋을듯
        float x = gameObject.transform.position.x, y = gameObject.transform.position.y;
        float ex = 0, ey = 0;

        if (enemytarget != null)
        {
            ex = enemytarget.transform.position.x;
            ey = enemytarget.transform.position.y;

            float d = Mathf.Sqrt((ex - x) * (ex - x) + (ey - y) * (ey - y));
            if (d > tracerange)
            {
                enemytarget = null;
            }


            //다른 타겟리스트와 현재 타겟을 비교하여 더 우선순위를 확인하여 변경 등의 조치
        }

        if (enemytarget == null)
        {
            float mindistance = tracerange, d;
            foreach (GameObject e in enemylist) //일단 제일 가까운 애를 고르는걸로
            {
                ex = e.transform.position.x;
                ey = e.transform.position.y;
                d  = Mathf.Sqrt((ex - x) * (ex - x) + (ey - y) * (ey - y));
                if (mindistance >= d)
                {
                    mindistance = d;
                    enemytarget = e;
                }
            }
        }

        UnitAction.act actbuf;
        //적 추적 및 공격 액션 생성
        if (enemytarget != null)
        {
            //usewapon 액션 생성
            List <weapon> wplist        = new List <weapon>(gameObject.GetComponents <weapon>());
            bool          nowp          = wplist.Count < 1; //weapon이 없음
            bool          outofrange    = true;             //weapon은 있는데 모두 사정거리 외, 이 경우에는 적에게 접근해야함
            bool          nowpavailable = true;             //모든 weapon이 쿨다운 등의 이유로 사용불가. 이 경우는 도망가거나 무빙을 치거나 해서 시간을 벌어야겠지

            float  range = 0;
            weapon outrangedwp;
            float  distance = Mathf.Sqrt((ex - x) * (ex - x) + (ey - y) * (ey - y));
            foreach (weapon wp in wplist)
            {
                if (wp == null)
                {
                    continue;
                }

                if (!wp.able())
                {
                    nowpavailable = nowpavailable && true;
                    continue;
                }
                else
                {
                    nowpavailable = false;
                }

                if (wp.range < distance)
                {
                    outrangedwp = wp;
                    if (range <= 0)
                    {
                        range = wp.range;
                    }
                    outofrange = outofrange && true;
                    continue;
                }
                else
                {
                    outofrange = false;
                }


                actbuf = new UnitAction.act("useweapon", 1, new int[] { getwpindex(wp) }, new float[] { ex, ey });
                dest.Add(actbuf);
            }


            if (nowpavailable || nowp)
            {
                //무-빙
                dest.Add(new UnitAction.act("moverandom", 1, null, new float[] { 1 }));
            }
            else if (outofrange) //그냥 else로해도되나
            {
                //적을 따라감
                float allowrange   = 0.5f; //무조건 사정거리 끝에 걸리게 이동하는게 정답은 아닐 수 있으므로 더 가까이 가도록 할려하는데 일단 고민중임
                float movedistance = distance - range + allowrange;


                dest.Add(new UnitAction.act("movedest", 1, null, new float[] { ex, ey, movedistance }));
            }


            if (dest.Count < 1)
            {
                Debug.Log("enemytarget is exist but no action");
            }
        }



        //이 메소드는 일단 뭘 할지에 대한 리스트를 작성하는것이므로 결정 자체는 다른 메소드에서..

        return(true);
    }
Exemplo n.º 4
0
    private bool personalact()
    {
        if (!uinfo.canaction) //행동불가면 행동을 할 수 없으니까 굳이 진행할 필요없음
        {
            return(true);
        }

        if (decision != null)
        {
            //타겟에 관한 행동을 하는 중인데 타겟이 없어진다면 모든 행동을 취소해야 할 필요가 있는거같음
            //타겟이 없을때 하는 행동은 아직 구상이 안됬으므로 아군타겟 적타겟 둘다 없으면 그냥 취소하는걸로
            if (enemytarget == null && allytarget == null)
            {
                action.add(new UnitAction.act("stop", 0, null, null));
                decision = null;
                return(false);
            }


            //있을 경우 decision을 action에 추가 후 true 리턴
            if (action.actnum <= 0 && uinfo.canaction)
            {
                action.add(decision);
                decision = null;
            }
            return(true);
        }

        //하고있는걸 멈춰야 하는지 판단, 그렇지않으면 그냥 기다림
        bool istimetostop = false;

        //멈춰야 하는지 판단할 정보는 incident(직접 여기서 수집한 것이 아닌 다른 시점에서 자신의 게임오브젝트가 받은 것 중에 의미있는것(데미지 입음 등)을 저장하는 곳임)
        foreach (information i in incident)
        {
            //현재 상태와 i를 바탕으로 istimetostop을 결정(true가 되면 바로 break)
            switch (i.type)
            {
            case "phit":     //투사체 피격
            {
                //투사체를 보낸 유닛의 정보 수집
                GameObject attacker = (GameObject)i.find("owner", "GameObject");

                //타겟이 없는데 추적거리 안에 있으면 추적 밑 공격
            }
            break;
            }


            if (istimetostop)
            {
                break;
            }
        }

        if (istimetostop)
        {
            action.add("stop", 0, null, null);
            //멈추고 infomation에 저장 후 false를 리턴하여 infomation을 바탕으로 한 makedecision 유도



            return(false);
        }

        //아무것도 하는것도 할 것도 없으면 할 것을 찾기 위해 false 리턴
        return(false);
    }