Пример #1
0
    //对应actor类型 创建
    private SkillActionBase GetSkillActionBase(uint frame, SkillAssetInfo skillInfo)
    {
        switch (skillInfo.actionType)
        {
        case SkillDefine.SkillActionType.PLAY_CONTROL:
            return(new SAPlayerControl(skillInfo.isCtrl, skillInfo.isSkillDir, this, frame));

        case SkillDefine.SkillActionType.PLAY_ANIM:
            return(new SAPlayAnim(skillInfo.animName, this, frame));

        case SkillDefine.SkillActionType.PLAY_MOVE:
            MoveInfo moveInfo = skillInfo.moveInfo;
            return(new SAPlayerMove(moveInfo, this, frame));

        case SkillDefine.SkillActionType.COLLIDER:
            CollBase collider = GetOperaColliderInfo(skillInfo.colliderInfo);
            return(new SACollider(collider, skillInfo.colliderInfo, this, frame));

        case SkillDefine.SkillActionType.COLLIDER_MOVE:
            CollBase colliderMove = GetOperaColliderInfo(skillInfo.colliderInfo);
            moveInfo = skillInfo.moveInfo;
            return(new SAColliderMove(moveInfo, colliderMove, skillInfo.colliderInfo, this, frame));

        case SkillDefine.SkillActionType.ADD_EFFECT:
            return(new SAEffect(skillInfo.effectInfo, this, frame));
            //case SkillDefine.SkillActionType.FIGHT_EFFECT:
            //    return new SAFightEffect(skillInfo.fightEffects,this,frame);
        }
        return(new SkillActionBase(this, frame));
    }
Пример #2
0
    private CollBase GetOperaColliderInfo(ColliderInfo colliderInfo)
    {
        CollBase collider = null;
        float    startX   = SkillPlayer.MovePos.x + colliderInfo.StartX;
        float    startZ   = SkillPlayer.MovePos.z + colliderInfo.StartZ;
        float    angle    = colliderInfo.StartAngle;

        if (colliderInfo.CollPosType == CollBase.PosType.SKILL || colliderInfo.CollPosType == CollBase.PosType.SKILL_ROTATE)
        {
            startX = Command.TargetPos.x + colliderInfo.StartX;
            startZ = Command.TargetPos.z + colliderInfo.StartZ;
            //附加操作旋转
            if (colliderInfo.CollPosType == CollBase.PosType.SKILL_ROTATE)
            {
                // 方向盘角度 与场景角度差异修正 修正符号(场景y轴 逆时针旋转 与方向盘顺时针旋转 一致)
                angle = Mathf.Atan2(-Command.SkillDir.z, Command.SkillDir.x) * Mathf.Rad2Deg + colliderInfo.StartAngle;
            }
        }
        switch (colliderInfo.ColliderType)
        {
        case CollBase.ColType.RECTANGLE:
            collider = new CollRectange(startX, startZ, angle, colliderInfo.Width, colliderInfo.Height);
            break;

        case CollBase.ColType.SECTOR:
            collider = new CollSector(startX, startZ, angle, colliderInfo.InCircle, colliderInfo.OutCircle, colliderInfo.Angle);
            break;

        default:
            collider = new CollRadius(startX, startZ, angle, colliderInfo.Radius);
            break;
        }

        return(collider);
    }
Пример #3
0
    public SAColliderMove(MoveInfo moveInfo, CollBase collider, ColliderInfo collidInfo, SkillActionParser actionParser, uint actFrame)
        : base(collider, collidInfo, actionParser, actFrame)
    {
        _moveInfo  = moveInfo;
        _moveCount = 0;

        ActionType = SkillDefine.SkillActionType.COLLIDER_MOVE;
    }
Пример #4
0
    public SACollider(CollBase collider, ColliderInfo collidInfo, SkillActionParser actionParser, uint actFrame)
        : base(actionParser, actFrame)
    {
        _collider      = collider;
        _colliderInfo  = collidInfo;
        _effectCounter = new EffectCounter();

        _colliderCount  = 0;
        ColliderDestroy = false;

        ActionType = SkillDefine.SkillActionType.COLLIDER;
        _frameMax  = _actFrame + collidInfo.LifeTime;

        CheckTargetList();
    }
Пример #5
0
    private static Mesh CreateRectangleMesh(CollBase collider)
    {
        CollRectange coll = collider as CollRectange;
        Mesh         mesh = new Mesh();

        Vector3[] vertices = new Vector3[4];
        vertices[0] = new Vector3(-coll.width * 0.5f, 0, -coll.height * 0.5f);
        vertices[1] = new Vector3(coll.width * 0.5f, 0, -coll.height * 0.5f);
        vertices[2] = new Vector3(coll.width * 0.5f, 0, coll.height * 0.5f);
        vertices[3] = new Vector3(-coll.width * 0.5f, 0, coll.height * 0.5f);
        int[] triangles = new int[6] {
            0, 3, 2, 2, 1, 0
        };

        mesh.vertices  = vertices;
        mesh.triangles = triangles;
        return(mesh);
    }
Пример #6
0
    private static Mesh CreateSectorMesh(CollBase collider)
    {
        CollSector coll        = collider as CollSector;
        float      insideRaius = coll.inCircle;
        float      radius      = coll.outCircle;
        int        segment     = 60;
        float      angleDegree = coll.angle;

        Mesh mesh = new Mesh();

        int vlen = segment * 2 + 2;

        Vector3[] vertices = new Vector3[vlen];

        float angle      = Mathf.Deg2Rad * angleDegree;
        float currAngle  = angle / 2;
        float deltaAngle = angle / segment;

        for (int i = 0; i < vlen; i += 2)
        {
            float cosA = Mathf.Cos(currAngle);
            float sinA = Mathf.Sin(currAngle);
            vertices[i]     = new Vector3(cosA * insideRaius, 0, sinA * insideRaius);
            vertices[i + 1] = new Vector3(cosA * radius, 0, sinA * radius);
            currAngle      -= deltaAngle;
        }

        int tlen = segment * 6;

        int[] triangles = new int[tlen];
        for (int i = 0, vi = 0; i < tlen; i += 6, vi += 2)
        {
            triangles[i]     = vi;
            triangles[i + 1] = vi + 1;
            triangles[i + 2] = vi + 3;
            triangles[i + 3] = vi + 3;
            triangles[i + 4] = vi + 2;
            triangles[i + 5] = vi;
        }

        mesh.vertices  = vertices;
        mesh.triangles = triangles;
        return(mesh);
    }
Пример #7
0
    private static Mesh CreateCircleMesh(CollBase collider)
    {
        int   segment = 60;
        float radius  = (collider as CollRadius).Radius;
        Mesh  mesh    = new Mesh();
        int   vlen    = 1 + segment;

        Vector3[] vertices = new Vector3[vlen];
        vertices[0] = Vector3.zero;

        float angleDegree = 360;
        float angle       = Mathf.Deg2Rad * angleDegree;
        float currAngle   = angle / 2;
        float deltaAngle  = angle / segment;

        for (int i = 1; i < vlen; i++)
        {
            float cosA = Mathf.Cos(currAngle);
            float sinA = Mathf.Sin(currAngle);
            vertices[i] = new Vector3(cosA * radius, 0, sinA * radius);
            currAngle  -= deltaAngle;
        }

        int tlen = segment * 3;

        int[] triangles = new int[tlen];
        for (int i = 0, vi = 1; i < tlen - 3; i += 3, vi++)
        {
            triangles[i]     = 0;
            triangles[i + 1] = vi;
            triangles[i + 2] = vi + 1;
        }
        triangles[tlen - 3] = 0;
        triangles[tlen - 2] = vlen - 1;
        triangles[tlen - 1] = 1;  //链接第一个点

        mesh.vertices  = vertices;
        mesh.triangles = triangles;
        return(mesh);
    }
Пример #8
0
    public static GameObject CreateColliderView(CollBase collider)
    {
        #if UNITY_EDITOR
        GameObject prefab = UnityEditor.AssetDatabase.LoadMainAssetAtPath("Assets/ResourcesLib/Skill/Prefabs/collider.prefab") as GameObject;
        if (null != prefab)
        {
            GameObject colliderView = GameObject.Instantiate(prefab);


            MeshFilter filter = colliderView.AddComponent <MeshFilter>();
            if (filter != null)
            {
                switch (collider.ColliderType)
                {
                case CollBase.ColType.RECTANGLE:
                    filter.sharedMesh = CreateRectangleMesh(collider);
                    break;

                case CollBase.ColType.SECTOR:
                    filter.sharedMesh = CreateSectorMesh(collider);
                    break;

                default:
                    filter.sharedMesh = CreateCircleMesh(collider);
                    break;
                }
            }

            MeshRenderer meshRender = colliderView.AddComponent <MeshRenderer>();
            Shader       shader     = Shader.Find("Diffuse");
            meshRender.sharedMaterial = new Material(shader);
            return(colliderView);
        }
#endif
        return(null);
    }
Пример #9
0
    public static bool CheckCollision(CollBase CollA, CollBase CollB)
    {
        //GameTool.Log("ZTCollider:CheckCollision",CollA.GetV2Pos(), CollB.GetV2Pos());
        if (CollA.ColliderType == CollBase.ColType.CIRCLE && CollB.ColliderType == CollBase.ColType.CIRCLE)
        {
            return(RadiusToRadius(CollA as CollRadius, CollB as CollRadius));
        }

        if (CollA.ColliderType == CollBase.ColType.RECTANGLE && CollB.ColliderType == CollBase.ColType.RECTANGLE)
        {
            return(RectangleToRectangle(CollA as CollRectange, CollB as CollRectange));
        }

        if (CollA.ColliderType == CollBase.ColType.SECTOR && CollB.ColliderType == CollBase.ColType.SECTOR)
        {
            return(SectorToSector(CollA as CollSector, CollB as CollSector));
        }

        //圆与其他碰撞
        if (CollA.ColliderType == CollBase.ColType.CIRCLE || CollB.ColliderType == CollBase.ColType.CIRCLE)
        {
            CollBase tmpCollA = CollA.ColliderType == CollBase.ColType.CIRCLE ? CollA : CollB;
            CollBase tmpCollB = CollA.ColliderType == CollBase.ColType.CIRCLE ? CollB : CollA;
            if (tmpCollB.ColliderType == CollBase.ColType.RECTANGLE)
            {
                return(RadiusToRectangle(tmpCollA as CollRadius, tmpCollB as CollRectange));
            }
            return(RadiusToSector(tmpCollA as CollRadius, tmpCollB as CollSector));
        }

        //矩形与扇形碰撞
        CollBase tmpCollC = CollA.ColliderType == CollBase.ColType.RECTANGLE ? CollA : CollB;
        CollBase tmpCollD = CollA.ColliderType == CollBase.ColType.RECTANGLE ? CollB : CollA;

        return(RectangleToSector(tmpCollC as CollRectange, tmpCollD as CollSector));
    }