Exemple #1
0
    // 快速转向并释放技能aa
    public void QuickSkill(Vector2 v, int iSkillID)
    {
        if (mMainCamera == null)
        {
            return;
        }

        Ray ray = mMainCamera.ScreenPointToRay(v);
        sdActorInterface monster = PickupMonster(ray);

        if (monster == null)
        {
            Vector3 terrainPosition = new Vector3();
            if (FingerGesturesInitializer.NavMesh_RayCast(ray, ref terrainPosition, 100000.0f))
            {
                Vector3 charPosition  = GetPosition();
                Vector3 nextDirection = terrainPosition - charPosition;
                MoveDir(nextDirection);
                fStopTime = 0.3f;
            }
        }
        else
        {
            Vector3 monsterPosition = monster.transform.position;
            Vector3 charPosition    = GetPosition();
            Vector3 nextDirection   = monsterPosition - charPosition;
            MoveDir(nextDirection);
            fStopTime = 0.3f;
        }

        CastSkill(iSkillID);
    }
Exemple #2
0
    public static bool NavMesh_RayCast(Vector3 kPos, ref Vector3 hitPoint)
    {
        Vector3 kDirection  = new Vector3(0.0f, -1.0f, 0.0f);
        Ray     kRay        = new Ray(kPos, kDirection);
        bool    bHasNavMesh = FingerGesturesInitializer.NavMesh_RayCast(kRay, ref hitPoint, 10.0f);

        return(bHasNavMesh);
    }
Exemple #3
0
    // 选择宠物出生点(选择出存在NavMesh但是不跟Monster存在碰撞的位置)aa
    public static bool BornPosition(Vector3 kPos, float fRadius, ref Vector3 kBornPos)
    {
        for (int iCount = 0; iCount < 16; ++iCount)
        {
            float fRandom = UnityEngine.Random.Range(0.0f, 1.0f);
            float fBiasX  = Mathf.Sin(fRandom * 2.0f * Mathf.PI) * fRadius;
            float fBiasZ  = Mathf.Cos(fRandom * 2.0f * Mathf.PI) * fRadius;

            Vector3 kOrigin = kPos;
            kOrigin.y += 2.0f;
            kOrigin.x += fBiasX;
            kOrigin.z += fBiasZ;

            Vector3 kDirection  = new Vector3(0.0f, -1.0f, 0.0f);
            Ray     kRay        = new Ray(kOrigin, kDirection);
            bool    bHasNavMesh = FingerGesturesInitializer.NavMesh_RayCast(kRay, ref kBornPos, 10.0f);
            if (!bHasNavMesh)
            {
                continue;
            }
            else
            {
                if (Mathf.Abs(kBornPos.y - kPos.y) > 0.5f)
                {
                    continue;
                }
                kRay = new Ray(kPos, kBornPos - kPos);
                RaycastHit hit;
                if (Physics.Raycast(kRay, out hit))
                {
                    float distance    = (kBornPos - kPos).magnitude;
                    float hitdistance = (hit.point - kPos).magnitude;
                    if (distance > hitdistance)
                    {
                        continue;
                    }
                    else
                    {
                        return(true);
                    }
                }
                else
                {
                    return(true);
                }
            }
        }
        kBornPos = kPos;                //< 选择主角位置aa
        return(false);
    }
Exemple #4
0
    //
    public void OnFingerUp(Vector2 v)
    {
        if (!mEnable)
        {
            return;
        }

        if (mMainCamera == null)
        {
            return;
        }

        Ray ray = mMainCamera.ScreenPointToRay(v);

        sdActorInterface monster = PickupMonster(ray);

        if (monster == null)
        {
            Vector3 point = new Vector3();
            if (FingerGesturesInitializer.NavMesh_RayCast(ray, ref point, 100000.0f))
            {
                Vector3    vNewPoint = point + new Vector3(0, 1, 0);
                Ray        newRay    = new Ray(vNewPoint, new Vector3(0, -1, 0));
                RaycastHit hit;
                if (Physics.Raycast(newRay, out hit))
                {
                    mPlayerAutoState.SetPoint(hit.point, this);
                    ShowMoveTarget(hit.point);
                }
                else
                {
                    mPlayerAutoState.SetPoint(point, this);
                    ShowMoveTarget(point);
                }
            }
            else
            {
                HideMoveTarget();
            }
        }
        else
        {
            mPlayerAutoState.SetTarget(monster, this);
        }
    }
    bool BuildHoneycomb()
    {
        Vector3[] vertex = null;
        int[]     f      = null;
        NavMesh.Triangulate(out vertex, out f);

        if (f == null)
        {
            return(false);
        }

        CalcBound(vertex);

        LayerHeight = (bound_max.y - bound_min.y) / iLayer;

        iLine = (int)((bound_max.x - bound_min.x) / fScale) + 1;
        iRow  = (int)((bound_max.z - bound_min.z) / honeycombLine) + 1;
        Count = iLine * iRow;
        BuildHoneycombMesh();
        navData = new byte[Count];

        int iFaceCount = f.Length / 3;

        //遍历每个三角形 逐个注入到双层的2维纹理中..
        for (int i = 0; i < iFaceCount; i++)
        {
            Vector3[] v = new Vector3[3];
            v[0] = vertex[f[i * 3]];

            //计算每个三角形的 包围盒 只计算XZ..
            Vector2 vmin = new Vector2(v[0].x, v[0].z);
            Vector2 vmax = vmin;
            for (int j = 1; j < 3; j++)
            {
                v[j] = vertex[f[i * 3 + j]];
                Vector2 vTemp = new Vector2(v[j].x, v[j].z);
                if (vmin.x > vTemp.x)
                {
                    vmin.x = vTemp.x;
                }
                if (vmin.y > vTemp.y)
                {
                    vmin.y = vTemp.y;
                }

                if (vmax.x < vTemp.x)
                {
                    vmax.x = vTemp.x;
                }
                if (vmax.y < vTemp.y)
                {
                    vmax.y = vTemp.y;
                }
            }


            //将包围盒转化为 索引值..
            int minx = (int)((vmin.x - bound_min.x) / fScale);
            int miny = (int)((vmin.y - bound_min.z) / honeycombLine);

            int maxx = (int)((vmax.x - bound_min.x) / fScale);
            int maxy = (int)((vmax.y - bound_min.z) / honeycombLine);

            //最最低索引开始 发射2维射线与三角形求交  并得到 相交部分的高度值..
            for (int j = minx; j <= maxx + 1; j++)
            {
                if (j >= iLine)
                {
                    continue;
                }

                for (int k = miny; k <= maxy + 1; k++)
                {
                    if (k >= iRow)
                    {
                        continue;
                    }
                    float xoffset = 0.0f;
                    if ((k & 1) == 1)
                    {
                        xoffset = fScale * 0.5f;
                    }

                    float x   = j * fScale + bound_min.x + xoffset;
                    float z   = k * honeycombLine + bound_min.z;
                    Ray   r   = new Ray(new Vector3(x, bound_max.y + 1.0f, z), new Vector3(0, -1, 0));
                    float dis = 100000.0f;
                    if (FingerGesturesInitializer.Ray_Triangle(r, v[0], v[1], v[2], ref dis))
                    {
                        float height = bound_max.y + 1.0f - dis;
                        //uint h = (uint)((height - bound_min.y) / LayerHeight);
                        //SaveVoxel(heightArray, j, k, h);
                        //Debug.Log(j + " " + k);
                        //if (h >= 63)
                        //{
                        //    h = 63;
                        //}

                        //navData[k * iLine + j] = (byte)( 0x80+h);

                        Vector3 ver = RenderVertex[k * iLine + j];
                        ver.y = height - bound_min.y;
                        RenderVertex[k * iLine + j] = ver;
                    }
                }
            }
        }
        return(true);
    }
Exemple #6
0
        // 从已有的行走面片构建Hexagon数据aa
        void BuildHexagonData(Vector3[] vertex, int[] face)
        {
            int iFaceCount = face.Length / 3;

            //遍历每个三角形 逐个注入到双层的2维纹理中..
            for (int i = 0; i < iFaceCount; i++)
            {
                Vector3[] v = new Vector3[3];
                v[0] = vertex[face[i * 3]];

                //计算每个三角形的 包围盒 只计算XZ..
                Vector2 vmin = new Vector2(v[0].x, v[0].z);
                Vector2 vmax = vmin;
                for (int j = 1; j < 3; j++)
                {
                    v[j] = vertex[face[i * 3 + j]];
                    Vector2 vTemp = new Vector2(v[j].x, v[j].z);
                    if (vmin.x > vTemp.x)
                    {
                        vmin.x = vTemp.x;
                    }
                    if (vmin.y > vTemp.y)
                    {
                        vmin.y = vTemp.y;
                    }

                    if (vmax.x < vTemp.x)
                    {
                        vmax.x = vTemp.x;
                    }
                    if (vmax.y < vTemp.y)
                    {
                        vmax.y = vTemp.y;
                    }
                }


                //将包围盒转化为 索引值..
                int minx = (int)((vmin.x - bound_min.x) / fXStep);
                int miny = (int)((vmin.y - bound_min.z) / fZStep);

                int maxx = (int)((vmax.x - bound_min.x) / fXStep);
                int maxy = (int)((vmax.y - bound_min.z) / fZStep);

                //最最低索引开始 发射2维射线与三角形求交  并得到 相交部分的高度值..
                for (int x = minx; x <= maxx + 1; x++)
                {
                    if (x >= xCount)
                    {
                        continue;
                    }

                    for (int z = miny; z <= maxy + 1; z++)
                    {
                        if (z >= zCount)
                        {
                            continue;
                        }
                        float xoffset = 0.0f;
                        if ((z & 1) == 1)
                        {
                            xoffset = fXStep * 0.5f;
                        }

                        float fx  = x * fXStep + bound_min.x + xoffset;
                        float fz  = z * fZStep + bound_min.z;
                        Ray   r   = new Ray(new Vector3(fx, bound_max.y + 1.0f, fz), new Vector3(0, -1, 0));
                        float dis = 100000.0f;
                        if (FingerGesturesInitializer.Ray_Triangle(r, v[0], v[1], v[2], ref dis))
                        {
                            float height = bound_max.y + 1.0f - dis;
                            uint  h      = (uint)((height - bound_min.y) / fYLayerHeight);

                            if (h >= Tile.HeightMask)
                            {
                                h = Tile.HeightMask;
                            }
                            SavePoint(x, z, h);
                        }
                    }
                }
            }
        }