コード例 #1
0
    public Aspect NaturalAspect()
    {
        Vector3         cameraPos = this.surfaceBillboardRef.RelativeCameraPosition();
        WalkerDirection lookedDir = this.LookedDirectionFromRelativePosition(cameraPos);

        return(AspectByLookedDirectionAndWalkerDirection[lookedDir][(WalkerDirection)this.data.direction]);
    }
コード例 #2
0
    public void Turn(WalkerDirection dir)
    {
        this.data.direction = (int)dir;

        Aspect asp = this.NaturalAspect();

        this.ChangeAspect(asp);
    }
コード例 #3
0
ファイル: Orbit.cs プロジェクト: dolow/taxi-manhattan
    public void RotateLeft()
    {
        this.axis.y = 1.0f;
        switch (DirectionUtil.RelativeDirection(this.transform.position, this.target.transform.position))
        {
        case Direction.South: this.destination = Direction.West; break;

        case Direction.East: this.destination = Direction.South; break;

        case Direction.North: this.destination = Direction.East; break;

        case Direction.West: this.destination = Direction.North; break;
        }
    }
コード例 #4
0
    private void UpdateWalkVector()
    {
        if (this.walkDirectionQueue.Count == 0)
        {
            return;
        }

        if (this.IsWalking())
        {
            return;
        }

        this.walkFrom = this.transform.position;

        Map map = MapLoader.CurrentMap();

        DirectionUtil.Direction nextDirection = this.walkDirectionQueue[0];
        this.walkDirectionQueue.RemoveAt(0);

        Map currentMap = MapLoader.CurrentMap();

        switch (nextDirection)
        {
        case DirectionUtil.Direction.South: this.walkVector = new Vector3(0.0f, 0.0f, -WalkDistanceUnit); break;

        case DirectionUtil.Direction.North: this.walkVector = new Vector3(0.0f, 0.0f, WalkDistanceUnit);  break;

        case DirectionUtil.Direction.East:  this.walkVector = new Vector3(WalkDistanceUnit, 0.0f, 0.0f);  break;

        case DirectionUtil.Direction.West:  this.walkVector = new Vector3(-WalkDistanceUnit, 0.0f, 0.0f); break;

        default: return;
        }

        this.data.direction = (int)nextDirection;
        this.data.address   = DirectionUtil.GetNeighborAddress(this.data.address, nextDirection, currentMap.width, currentMap.height);
    }
コード例 #5
0
    public void RefreshDistance()
    {
        DirectionUtil.Direction currentDirection = this.GetCalcuratedDirection();
        if (currentDirection == DirectionUtil.Direction.None)
        {
            currentDirection = DirectionUtil.Direction.South;
        }

        Vector3 baseDistance = this.baseSouthDistance;
        Vector3 newDistance  = baseDistance;

        switch (currentDirection)
        {
        case DirectionUtil.Direction.North:
        {
            newDistance.x = -baseDistance.x;
            newDistance.z = -baseDistance.z;
            break;
        }

        case DirectionUtil.Direction.East:
        {
            newDistance.x = -baseDistance.z;
            newDistance.z = baseDistance.x;
            break;
        }

        case DirectionUtil.Direction.West:
        {
            newDistance.x = baseDistance.z;
            newDistance.z = -baseDistance.x;
            break;
        }
        }

        this.SetDistance(newDistance);
    }
コード例 #6
0
    private static GameObject InstantiateFields(
        GameObject mapRoot,
        MeshFilter tilePool,
        FieldTile fieldPrototype,
        FieldTile verticalPrototype,
        FieldCollider fieldColliderPrototype,
        Action <Map, MeshFilter, int, int> onEachTile
        )
    {
        Map map = MapLoader.currentMap;

        mapRoot.isStatic = true;

        int fieldAspects = 4;
        int width        = map.width;

        int floors = (map.fields.Length > map.verticalFields.Length)
            ? map.fields.Length
            : map.verticalFields.Length;

        Dictionary <int, List <MeshFilter> > meshFilterDictionary         = new Dictionary <int, List <MeshFilter> >();
        Dictionary <int, List <MeshFilter> > verticalMeshFilterDictionary = new Dictionary <int, List <MeshFilter> >();

        // TODO: reduce draw call, RT? Mesh Combine?
        for (int floor = 0; floor < floors; floor++)
        {
            int[] floorField = (map.fields.Length > floor)
                ? map.fields[floor]
                : new int[] { };

            int[][] floorVerticalField = (map.verticalFields.Length > floor)
                ? map.verticalFields[floor]
                : new int[][] { };

            int indexes = (floorField.Length >= floorVerticalField.Length)
                ? floorField.Length
                : floorVerticalField.Length;

            for (int i = 0; i < indexes; i++)
            {
                int col = i % width;
                int row = (int)Mathf.Floor(i / width);

                do // collect MeshFilters of horizontal fields by same appearance
                {
                    if (floorField.Length <= i)
                    {
                        break;
                    }

                    int fieldId = floorField[i];
                    if (fieldId == MapLoader.EmptyField)
                    {
                        break;
                    }

                    MeshFilter filter = GameObject.Instantiate <MeshFilter>(tilePool);
                    filter.transform.parent   = mapRoot.transform.transform;
                    filter.transform.rotation = MapLoader.SurfaceUp;
                    filter.transform.position = new Vector3(col * FieldUnit.x + FieldUnit.x * 0.5f, (float)floor * FieldUnit.y, -row * FieldUnit.z - FieldUnit.z * 0.5f);

                    if (!meshFilterDictionary.ContainsKey(fieldId))
                    {
                        meshFilterDictionary.Add(fieldId, new List <MeshFilter> {
                        });
                    }

                    List <MeshFilter> filters = meshFilterDictionary[fieldId];
                    filters.Add(filter);
                    onEachTile?.Invoke(MapLoader.currentMap, filter, col, row);
                } while (false);

                do // collect MeshFilters of vertical fields by same appearance
                {
                    if (floorVerticalField.Length <= i)
                    {
                        break;
                    }

                    int[] verticalFieldDirections = floorVerticalField[i];
                    if (verticalFieldDirections.Length != fieldAspects)
                    {
                        break;
                    }

                    for (int directionNumber = 0; directionNumber < verticalFieldDirections.Length; directionNumber++)
                    {
                        int verticalFieldId = verticalFieldDirections[directionNumber];
                        if (verticalFieldId == MapLoader.EmptyField)
                        {
                            continue;
                        }

                        DirectionUtil.Direction direction = (DirectionUtil.Direction)directionNumber;

                        MeshFilter verticalFilter = GameObject.Instantiate <MeshFilter>(tilePool);
                        verticalFilter.transform.parent   = mapRoot.transform.transform;
                        verticalFilter.transform.rotation = MapLoader.SurfaceDirection[direction];
                        verticalFilter.transform.position = new Vector3(col * FieldUnit.x + 0.5f, ((float)floor + 0.5f) * FieldUnit.y, -row * FieldUnit.z - 0.5f) + MapLoader.SurfaceOffset[direction];

                        if (!verticalMeshFilterDictionary.ContainsKey(verticalFieldId))
                        {
                            verticalMeshFilterDictionary.Add(verticalFieldId, new List <MeshFilter> {
                            });
                        }

                        List <MeshFilter> verticalFilters = verticalMeshFilterDictionary[verticalFieldId];
                        verticalFilters.Add(verticalFilter);
                    }
                } while (false);
            }

            FieldCollider fieldCollider = GameObject.Instantiate <FieldCollider>(fieldColliderPrototype);
            float         height        = Mathf.Floor(map.fields[0].Length / width) + 1;
            fieldCollider.Init(width, height, floor);
            fieldCollider.transform.parent = mapRoot.transform;
            // TODO:
            fieldCollider.gameObject.SetActive(floor == 0);
        }

        // combine meshes
        {
            foreach (KeyValuePair <int, List <MeshFilter> > kv in meshFilterDictionary)
            {
                List <MeshFilter> filters = kv.Value;
                CombineInstance[] combine = new CombineInstance[filters.Count];
                for (int i = 0; i < filters.Count; i++)
                {
                    combine[i].mesh         = filters[i].sharedMesh;
                    combine[i].transform    = filters[i].transform.localToWorldMatrix;
                    combine[i].subMeshIndex = 0;
                    GameObject.Destroy(filters[i].gameObject);
                }

                FieldTile tile = GameObject.Instantiate <FieldTile>(fieldPrototype);
                tile.InitCombinedFloor(combine, kv.Key - 1);
                tile.transform.parent = mapRoot.transform;
            }

            foreach (KeyValuePair <int, List <MeshFilter> > kv in verticalMeshFilterDictionary)
            {
                List <MeshFilter> filters = kv.Value;
                CombineInstance[] combine = new CombineInstance[filters.Count];
                for (int i = 0; i < filters.Count; i++)
                {
                    combine[i].mesh         = filters[i].sharedMesh;
                    combine[i].transform    = filters[i].transform.localToWorldMatrix;
                    combine[i].subMeshIndex = 0;
                    GameObject.Destroy(filters[i].gameObject);
                }

                FieldTile tile = GameObject.Instantiate <FieldTile>(verticalPrototype);
                tile.InitCombinedFloor(combine, kv.Key - 1);
                tile.gameObject.AddComponent <Terrain>();
                tile.transform.parent = mapRoot.transform;

                // skip this if scene allows penetrate path finding raycast
                MeshCollider collider = tile.GetComponent <MeshCollider>();
                collider.sharedMesh = tile.GetComponent <MeshFilter>().sharedMesh;

                /*
                 * CombineInstance[] rcombine = new CombineInstance[filters.Count];
                 * for (int i = 0; i < filters.Count; i++)
                 * {
                 *  Vector3 euler = rcombine[i].transform.rotation.eulerAngles;
                 *  rcombine[i].mesh = filters[i].sharedMesh;
                 *  filters[i].transform.rotation = Quaternion.Euler(new Vector3(euler.x, euler.y + 180.0f, euler.z));
                 *  rcombine[i].transform = filters[i].transform.localToWorldMatrix;
                 *  rcombine[i].subMeshIndex = 0;
                 *  GameObject.Destroy(filters[i].gameObject);
                 * }
                 *
                 * FieldTile rtile = GameObject.Instantiate<FieldTile>(verticalPrototype);
                 * rtile.InitCombinedFloor(rcombine, kv.Key - 1);
                 * rtile.gameObject.AddComponent<Terrain>();
                 * rtile.transform.parent = mapRoot.transform;
                 *
                 * // skip this if scene allows penetrate path finding raycast
                 * MeshCollider rcollider = rtile.GetComponent<MeshCollider>();
                 * rcollider.sharedMesh = rtile.GetComponent<MeshFilter>().sharedMesh;
                 */
            }
        }

        return(mapRoot);
    }
コード例 #7
0
ファイル: Orbit.cs プロジェクト: dolow/taxi-manhattan
    private void Update()
    {
        if (this.target == null)
        {
            return;
        }

        if (this.destination == Direction.None)
        {
            return;
        }

        Vector3 lastRel = this.target.transform.position - this.transform.position;

        this.transform.RotateAround(this.target.position, this.axis, Time.deltaTime * this.speed);

        Vector3 rel = this.target.transform.position - this.transform.position;

        switch (this.destination)
        {
        case Direction.South:
        {
            if ((lastRel.x > 0.0f && rel.x <= 0.0f) || (lastRel.x < 0.0f && rel.x >= 0.0f))
            {
                this.destination = Direction.None;
            }
            break;
        }

        case Direction.North:
        {
            if ((lastRel.x > 0.0f && rel.x <= 0.0f) || (lastRel.x < 0.0f && rel.x >= 0.0f))
            {
                this.destination = Direction.None;
            }
            break;
        }

        case Direction.East:
        {
            if ((lastRel.z > 0.0f && rel.z <= 0.0f) || (lastRel.z < 0.0f && rel.z >= 0.0f))
            {
                this.destination = Direction.None;
            }
            break;
        }

        case Direction.West:
        {
            if ((lastRel.z > 0.0f && rel.z <= 0.0f) || (lastRel.z < 0.0f && rel.z >= 0.0f))
            {
                this.destination = Direction.None;
            }
            break;
        }
        }

        this.transform.LookAt(this.target.position);

        if (this.destination == Direction.None)
        {
            this.axis.y = 0.0f;
            this.OnRotateFinished?.Invoke();
        }
    }