SchultzGames
Para tirar dúvidas, crie um tópico especifico na área "Dúvidas em Geral" e aguarde ser respondido. Evite comentar em tópicos não relacionados a sua dúvida :D
TÓPICOS RECENTES:
Tópico:
Postado em:
Postado por:
[DUVIDA] UV MAPPING EM VÁRIOS OBJETOS - BLENDER
Como ativar som ao passar por cima de um objeto?
[PROJETO] A ULTIMA CASA DA RUA
Meu novo game
[DUVIDA SIMPLES]
Projeto Game de Terror
[DÚVIDA] Modelo do Sketchup não importa corretamente
probleminha ao usar o Platform Effector2d
Criar game multi player unity 3d
Volleyguys - jogo de vôlei
The freddy krueger's pie (Game)
Novo Trailer do jogo 13º Andar
[TUTORIAL] Banco de dados || MySQL
Touch para 2 Jogadores
Set Height do terreno
XML, suporte e utilização.
Travar animação
[DIVULGAÇÃO DE AULA] Como criar jogos sem saber programação
Porque meu objeto não está sendo ativado? unity 2D
[RESOLVIDO] Como fazer o canvas ficar atrás do personagem? Unity 2D
[TUTORIAL] Controlador em Primeira Pessoa "compacto" FPS
Tem como modificar a textura em tempo real?
TEXTO DO BUTTON
ALTERAR A VELOCIDADE APENAS DE UMA ANIMAÇÃO VIA SCRIPT
Valor de App de Realidade Aumentada.
Como Fasso Para O HingeJoint Virar em Duas Direçoes?
Pegar objeto tocado em dispositivo mobile
Árvores sem billboard
[TUTORIAL] Criar Analógico Virtual UI Para Mobile.
Arquivos com Casa, arvores, Gramas, Objetos3d Etc...
distancia
Unity 2019.1.1 não entra em Modo Play
Como fazer um sistema de conetar objetos 3d ao passar proximo de um Trigger?
Como fazer pro meu tiro matar o inimigo?
Fazer personagem descer uma tirolesa
Duvida script de loading com controle
Como implementar Gyroscope no FPSController ?
Bug de Iluminação Unity 2019
Não consigo dar dano nem destruir um objeto
SCRIPT DE MOVIMENTAÇÃO E CÂMERA
[PEDIDO DE TUTORIAL] Schultz fazer uma série *jogo de corrida*
[FAZER TUTORIAL] Como faço para clicar em um objeto e visualizar, girar...
Como finalizar a textura no blender
É possivel detectar colisão de um objeto filho pelo objeto pai?
Como atrasar uma animação Unity 2D
AJUDA COM SCRIPT DE LOAD DE CENA
[TUTORIAL] Sistema de DIA E NOITE completo, com luzes noturnas e SISTEMA DE NUVENS
[RESOLVIDO] Como mudar a cor do Text?
[PEDIDOS DE TUTORIAIS]
saber se os objetos colidiram
navmeshagent Duvida sobre a distancia percorrida
[TUTORIAL] Mover objetos 2D e conectar em lugares específicos
Balão de Conversação
[TUTORIAL] Como usar FREE EASY CRIATURA CONTROLE IA
Vale apena colocar esse Asset na Asset Store?
Como faço para que mostre algo que vai instanciar?
TRANSFORM DA POSIÇÃO NÃO SEGUE A ANIMAÇÃO
[TUTORIAL] Sistema de Lanterna com Pilhas
[TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
UNITY, TRANSFORM.TRANSLATE ATRAVESSA PAREDES
Como Fazer Agregação via script do Unity?
( Ajuda) gráficos longe ruim
Verificar se objeto ja existe em um Lista
Fog of War
Scope Script
Animar um Número de Vezes
AJUDA COM MUDANÇA DE CENA
Porque meu aúdio não funciona na colisao do player com o objeto?
[RESOLVIDO] UNITY OBJETOS COM MESMO SCRIPT DE FORMA INDEPENDENTE
Comunicação entre scripts
[TUTORIAL] Script de pulo para jogos 3D em geral (Unity - C#)
[____TÓPICO LIVRE____] FALE O QUE QUISER (Parte 2)
Esse erro de código é da Unity ou da versão do Script?
Game Take All
PRESSIONAR BOTÃO TOUCH NO ANDROID SERÁ O MESMO QUE PRESSIONAR UMA TECLA DO TECLADO REAL
PROBLEMAS AO DAR BUILD
PRESSIONAR BOTÃO TOUCH NO ANDROID SERÁ O MESMO QUE PRESSIONAR UMA TECLA DO TECLADO FÍSICO
Duvida seleção de personagemsn
Como faço para distanciar um objeto do outro pelo script?
[Em Desenvolvimento] Battles of Worlds
Ajuda com Ragdoll (Ta muito bugado)!!!
AJUDA - TUTORIAL Unity 2017 - Mover e rotacionar para a POSIÇÃO do MOUSE
Touch movendo objeto através duma Layer
[RESOLVIDO] Tentando fazer interação com botão do Mouse(1) nos slots!
[TUTORIAL] Unity 2019 - Lanterna e pilhas, com UI
Mecânica estilingue Angry Birds.
Sobre o StreamLabs OBS e o baixo FPS
[____APOIE O FÓRUM E O CANAL E GANHE RECOMPENSAS____]
Loja de Roupa estilo GTA V
duvida em desenho
[TUTORIAL] GameObject.Find ( achar objetos pelo nome )
[RESOLVIDO] Como faço pro inimigo dar dano no personagem (jogo 2D de plataforma)
Rotação em um eixo
MAIS DE UMA ANIMAÇÃO NO PLAYER
[RESOLVIDO] Ajuda com rotação local
Instalar nova versão Unity 2019
[RESOLVIDO] Solução Unity 2019 erro Text Mesh Pro
Como faço para meu inimigo se movimentar da esquerda para direita estilo super mário?
[RESOLVIDO] AO ABRIR NOVAMENTE A CENA OS PARTICLESYSTEMS NÃO FUNCIONAM
Hoje à(s) 10:36 pm
Hoje à(s) 10:34 pm
Hoje à(s) 7:57 pm
Hoje à(s) 2:51 pm
Ontem à(s) 10:26 pm
Ontem à(s) 9:45 pm
Ontem à(s) 2:28 pm
Ontem à(s) 2:27 pm
Ontem à(s) 1:59 pm
Ontem à(s) 9:24 am
Sex Maio 17, 2019 6:34 pm
Sex Maio 17, 2019 6:30 pm
Sex Maio 17, 2019 10:30 am
Qui Maio 16, 2019 8:14 pm
Qui Maio 16, 2019 8:10 pm
Qui Maio 16, 2019 6:46 pm
Qui Maio 16, 2019 5:31 pm
Qui Maio 16, 2019 4:08 pm
Qui Maio 16, 2019 3:24 pm
Qui Maio 16, 2019 12:14 pm
Qui Maio 16, 2019 9:30 am
Qua Maio 15, 2019 4:13 pm
Qua Maio 15, 2019 3:03 pm
Qua Maio 15, 2019 10:17 am
Qua Maio 15, 2019 12:45 am
Seg Maio 13, 2019 7:34 pm
Seg Maio 13, 2019 3:06 pm
Dom Maio 12, 2019 10:10 pm
Dom Maio 12, 2019 7:52 pm
Dom Maio 12, 2019 7:13 pm
Dom Maio 12, 2019 6:38 pm
Dom Maio 12, 2019 1:27 pm
Dom Maio 12, 2019 10:57 am
Dom Maio 12, 2019 2:02 am
Sab Maio 11, 2019 2:03 pm
Sab Maio 11, 2019 1:12 pm
Sab Maio 11, 2019 12:58 pm
Sab Maio 11, 2019 9:06 am
Sex Maio 10, 2019 6:46 pm
Sex Maio 10, 2019 1:34 pm
Sex Maio 10, 2019 12:39 pm
Sex Maio 10, 2019 9:47 am
Qui Maio 09, 2019 8:18 pm
Qui Maio 09, 2019 7:41 pm
Qui Maio 09, 2019 11:44 am
Qui Maio 09, 2019 10:38 am
Qua Maio 08, 2019 10:04 pm
Qua Maio 08, 2019 9:49 pm
Qua Maio 08, 2019 1:56 pm
Qua Maio 08, 2019 12:55 pm
Qua Maio 08, 2019 9:33 am
Qua Maio 08, 2019 9:23 am
Qua Maio 08, 2019 8:52 am
Qua Maio 08, 2019 7:24 am
Ter Maio 07, 2019 11:00 pm
Ter Maio 07, 2019 6:46 pm
Ter Maio 07, 2019 5:06 pm
Ter Maio 07, 2019 3:23 pm
Ter Maio 07, 2019 12:50 am
Seg Maio 06, 2019 11:58 pm
Seg Maio 06, 2019 9:27 pm
Seg Maio 06, 2019 2:06 pm
Seg Maio 06, 2019 1:52 pm
Seg Maio 06, 2019 9:43 am
Dom Maio 05, 2019 9:41 pm
Dom Maio 05, 2019 9:00 pm
Dom Maio 05, 2019 7:41 pm
Dom Maio 05, 2019 10:53 am
Sab Maio 04, 2019 4:30 pm
Sab Maio 04, 2019 1:33 pm
Sex Maio 03, 2019 8:41 pm
Sex Maio 03, 2019 4:59 pm
Sex Maio 03, 2019 4:34 pm
Sex Maio 03, 2019 3:40 pm
Sex Maio 03, 2019 4:59 am
Qui Maio 02, 2019 11:23 pm
Qui Maio 02, 2019 8:41 pm
Qui Maio 02, 2019 8:13 pm
Qui Maio 02, 2019 7:23 pm
Qui Maio 02, 2019 6:52 pm
Qui Maio 02, 2019 6:11 pm
Qui Maio 02, 2019 1:52 pm
Qua Maio 01, 2019 9:33 pm
Qua Maio 01, 2019 8:47 pm
Qua Maio 01, 2019 6:29 pm
Ter Abr 30, 2019 2:22 am
Seg Abr 29, 2019 10:16 pm
Seg Abr 29, 2019 10:12 pm
Seg Abr 29, 2019 7:56 pm
Seg Abr 29, 2019 2:46 pm
Sab Abr 27, 2019 7:20 pm
Sab Abr 27, 2019 3:38 pm
Sab Abr 27, 2019 3:00 am
Sab Abr 27, 2019 12:01 am
Sex Abr 26, 2019 8:08 pm
Sex Abr 26, 2019 7:40 pm
Sex Abr 26, 2019 7:34 pm
Qui Abr 25, 2019 10:06 pm
Qui Abr 25, 2019 9:32 pm
diegopds
diegopds
guimaraf
thales.ulisses
rafaelllsd
thales.ulisses
DARKcrons
nando07
artplayer
Daniel Pires da Silva
thales.ulisses
thales.ulisses
Khrys
GabriG07
SuperGamer
Tegh
MarcioGSouza
igorsp3
NKKF
darkrj
gabrieldeelay
glauco
lTHINGl
artplayer
numb123
williangamesbr4021
Marcelo Santos
RuyVictor
Édipo
Callyde Jr
artplayer
ronigleydson
henriquegames501
darkrj
SergioDB
loganout
loganout
MarcosSchultz
NKKF
JohnRambo
JohnRambo
lidog
diegopds
LucasRangel
darkrj
Diego Felix
BrazaTattoo
dkrazor
Gabryellx007
rafaelholanda
UesleiUsl
eljkb
artplayer
kraulim
glauco
NKKF
osiasbezerra
robertodf
guimaraf
ronigleydson
osiasbezerra
deikson
numb123
Valakinhas
NKKF
osiasbezerra
BrazaTattoo
dstaroski
diegodiego01
Callyde Jr
jogador432
glauco
Tegh
Tegh
richardfalcos
BrazaTattoo
richardfalcos
Tonny3DM
NKKF
Dom3000
joveem
daniel123163
edvanmelo
BanaNiao
MarcosSchultz
rafaelllsd
lesgoy
MarcosSchultz
Callyde Jr
diegopds
MarcosSchultz
darkrj
MarcosSchultz
Callyde Jr
Nowsfeky
Callyde Jr
Callyde Jr
darkrj
wagnercaragua

Ajuda com script movimento por Grid Tile no Navmesh

Ir em baixo

PEDIDO Ajuda com script movimento por Grid Tile no Navmesh

Mensagem por Nowsfeky em Qui Out 04, 2018 11:41 am

Bom dia Pessoal !

Sou novo aki no forum mas um grande fã de jogos RPG's e do Unity.
Estou fazendo meu mmorpg e preciso de uma ajudinha. Estou precisando arrumar o movimento
do player e dos mobs.
Estou usando o Navigation2D da assets store que faz um navmesh para 2D. OK ele funciona perfeitamente, mas gostaria
que o player e os mobs se movimentassem por Grid Tile, ou seja, sem diagonal e parar sempre no centro do Tile. Mesmo sistema de movimento do jogo Tibia para quem conhece Smile
Para fazer o mapa estou usando o recurso do Tilemap do Unity ai depois uso o Navigation2D para gerar a malha do navmesh
e o player desviar automaticamente dos obstáculos.
Não sei se preciso alterar o script do Navigation2D ou do movimento do player e como alterar o algorítimo, por isso preciso de ajuda.

Gostaria que o movimento fosse algo parecido com isso:

https://youtu.be/RPmuCtcldBg
https://github.com/Chris85bh/Navigation2D

Desde já agradeço.
Nowsfeky
Nowsfeky
Iniciante
Iniciante

Masculino PONTOS : 297
REPUTAÇÃO : 5
Idade : 32
Áreas de atuação : Iniciante em programação C#.
Respeito as regras : Ajuda com script movimento por Grid Tile no Navmesh WvDYdlf

Ver perfil do usuário

Voltar ao Topo Ir em baixo

PEDIDO Re: Ajuda com script movimento por Grid Tile no Navmesh

Mensagem por Nowsfeky em Qui Out 04, 2018 6:29 pm

Desculpem. Esqueci de postar os Scripts para vocês me ajudarem.

Essa é a parte do script do player para o movimento por clique no mapa e usando o teclado. A parte de usar o teclado eu alterei para não usar a diagonal mas não consegui fazer para o player parar sempre no centro do tile.
Código:
void SelectionHandling()
    {
 
        // click raycasting if not over a UI element & not pinching on mobile
        // note: this only works if the UI's CanvasGroup blocks Raycasts
        if (Input.GetMouseButtonDown(0) && !Utils.IsCursorOverUserInterface() && Input.touchCount <= 1)
        {
            // cast a 3D ray from the camera towards the 2D scene.
            // Physics2D.Raycast isn't made for that, we use GetRayIntersection.
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            // raycast with local player ignore option
            RaycastHit2D hit = localPlayerClickThrough ? Utils.Raycast2DWithout(ray, gameObject) : Physics2D.GetRayIntersection(ray);


            // valid target?
            Entity entity = hit.transform != null ? hit.transform.GetComponent<Entity>() : null;
            if (entity)
            {
                // set indicator
                SetIndicatorViaParent(hit.transform);

                // clicked last target again? and is not self or pet?
                if (entity == target && entity != this && entity != activePet)
                {
                    // attackable? => attack
                    if (CanAttack(entity))
                    {
                        // cast the first skill (if any, and if ready)
                        if (skills.Count > 0 && skills[0].IsReady())
                            CmdUseSkill(0);
                        // otherwise walk there if still on cooldown etc
                        // use collider point(s) to also work with big entities
                        else
                            CmdNavigateDestination(entity.collider.ClosestPointOnBounds(transform.position), skills.Count > 0 ? skills[0].castRange : 0f);
                    }
                    // npc & alive => talk
                    else if (entity is Npc && entity.health > 0)
                    {
                        // close enough to talk?
                        // use collider point(s) to also work with big entities
                        if (Utils.ClosestDistance(collider, entity.collider) <= interactionRange)
                            FindObjectOfType<UINpcDialogue>().Show();
                        // otherwise walk there
                        // use collider point(s) to also work with big entities
                        else
                            CmdNavigateDestination(entity.collider.ClosestPointOnBounds(transform.position), interactionRange);
                    }
                    // monster & dead => loot
                    else if (entity is Monster && entity.health == 0)
                    {
                        // has loot? and close enough?
                        // use collider point(s) to also work with big entities
                        if (((Monster)entity).HasLoot() &&
                            Utils.ClosestDistance(collider, entity.collider) <= interactionRange)
                            FindObjectOfType<UILoot>().Show();
                        // otherwise walk there
                        // use collider point(s) to also work with big entities
                        else
                            CmdNavigateDestination(entity.collider.ClosestPointOnBounds(transform.position), interactionRange);
                    }

                    // addon system hooks
                    Utils.InvokeMany(typeof(Player), this, "OnSelect_", entity);
                // clicked a new target
                }
                else
                {
                    // target it
                    CmdSetTarget(entity.netIdentity);
                }
            }
            // if we hit nothing then we want to move somewhere
            else
            {
 
                // set indicator and navigate to the nearest walkable
                // destination. this prevents twitching when destination is
                // accidentally in a room without a door etc.
                Vector2 worldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                Vector2 bestDestination = agent.NearestValidDestination(worldPos);
                SetIndicatorViaPosition(bestDestination);
 CmdNavigateDestination (bestDestination, 0);

            }
        }
    }

void WSADHandling()
    {
        // don't move if currently typing in an input
        // we check this after checking h and v to save computations
        if (!UIUtils.AnyInputActive())
        {
            // get horizontal and vertical input
            // note: no != 0 check because it's 0 when we stop moving rapidly
            float horizontal = Input.GetAxis("Horizontal");
            float vertical = Input.GetAxis("Vertical");

            // create direction, normalize in case of diagonal movement
            Vector2 direction = new Vector2(horizontal, vertical);

            if (Mathf.Abs(direction.x) > Mathf.Abs(direction.y))
            {
                direction.y = 0;
            }
            else
            {
                direction.x = 0;
            }

            //if (direction.magnitude > 1) direction = direction.normalized;

            // draw direction for debugging
            Debug.DrawLine(transform.position, transform.position + (Vector3)direction, Color.green, 0, false);

            // clear indicator if there is one, and if it's not on a target
            // (simply looks better)
            if (direction != Vector2.zero && indicator != null && indicator.transform.parent == null)
                Destroy(indicator);

            // send to server - if changed since last time to save bandwidth
            if (direction != lastDirection)
            {
                CmdNavigateVelocity(direction);
                lastDirection = direction;
            }
        }
    }


E esse é o script do Navigation2D para gerar o navmesh no mapa 2D:

Código:
using UnityEditor;
using UnityEditor.AI;
using UnityEngine;
using UnityEngine.AI;
#if UNITY_2017_2_OR_NEWER
using UnityEngine.Tilemaps;
#endif
using System.Collections.Generic;
using System.Linq;

public class Navigation2D : EditorWindow
{
    // options
    float navmeshExtends = 1;
    static int drawMode = 0; // 0 = wireframe, 1 = full

    bool IsValidCollider(Collider2D co)
    {
        // usable for navmesh generation if not trigger and if navigation static
        bool navstatic = GameObjectUtility.AreStaticEditorFlagsSet(co.gameObject, StaticEditorFlags.NavigationStatic);
        return navstatic && co.enabled && !co.isTrigger;
    }

    // set area as not walkable so that huge objects dont get walkable areas
    // inside of them
    void MakeUnwalkable(GameObject go)
    {
        int layer = GameObjectUtility.GetNavMeshAreaFromName("Not Walkable");
        GameObjectUtility.SetNavMeshArea(go, layer);
    }

    void AddBoxCollider2Ds(Transform parent)
    {
        // find all valid colliders, add them to projection
        var colliders = GameObject.FindObjectsOfType<BoxCollider2D>();
        var filtered = colliders.Where(co => IsValidCollider(co)).ToList();
        foreach (var collider in filtered)
        {
            // note: creating a primitive is necessary in order for it to bake properly
            var go = GameObject.CreatePrimitive(PrimitiveType.Cube);
            go.isStatic = true;
            go.transform.parent = parent;
            // position via offset and transformpoint
            var localPos = new Vector3(collider.offset.x, collider.offset.y, 0);
            var worldPos = collider.transform.TransformPoint(localPos);
            go.transform.position = new Vector3(worldPos.x, 0, worldPos.y);
            // scale depending on scale * collider size (circle=radius/box=size/...)
            go.transform.localScale = NavMeshUtils2D.ScaleFromBoxCollider2D(collider);
            // rotation
            go.transform.rotation = Quaternion.Euler(NavMeshUtils2D.RotationTo3D(collider.transform.eulerAngles));

            MakeUnwalkable(go);
        }
    }

    void AddCircleCollider2Ds(Transform parent)
    {
        // find all valid colliders, add them to projection
        var colliders = GameObject.FindObjectsOfType<CircleCollider2D>();
        var filtered = colliders.Where(co => IsValidCollider(co)).ToList();
        foreach (var collider in filtered)
        {
            // note: creating a primitive is necessary in order for it to bake properly
            var go = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
            go.isStatic = true;
            go.transform.parent = parent;
            // position via offset and transformpoint
            var localPos = new Vector3(collider.offset.x, collider.offset.y, 0);
            var worldPos = collider.transform.TransformPoint(localPos);
            go.transform.position = new Vector3(worldPos.x, 0, worldPos.y);
            // scale depending on scale * collider size (circle=radius/box=size/...)
            go.transform.localScale = NavMeshUtils2D.ScaleFromCircleCollider2D(collider);
            // rotation
            go.transform.rotation = Quaternion.Euler(NavMeshUtils2D.RotationTo3D(collider.transform.eulerAngles));

            MakeUnwalkable(go);
        }
    }

    void AddPolygonCollider2Ds(Transform parent)
    {
        // find all valid colliders, add them to projection
        var colliders = GameObject.FindObjectsOfType<PolygonCollider2D>();
        var filtered = colliders.Where(co => IsValidCollider(co)).ToList();
        foreach (var collider in filtered)
        {
            // note: creating a primitive is necessary in order for it to bake properly
            var go = GameObject.CreatePrimitive(PrimitiveType.Cube);
            go.isStatic = true;
            go.transform.parent = parent;

            // position via offset and transformpoint
            var localPos = new Vector3(collider.offset.x, collider.offset.y, 0);
            var worldPos = collider.transform.TransformPoint(localPos);
            go.transform.position = new Vector3(worldPos.x, 0, worldPos.y);
            // scale depending on scale * collider size (circle=radius/box=size/...)
            go.transform.localScale = NavMeshUtils2D.ScaleFromPolygonCollider2D(collider);
            // rotation
            go.transform.rotation = Quaternion.Euler(NavMeshUtils2D.RotationTo3D(collider.transform.eulerAngles));

            // remove box collider. note that baking uses the meshfilter, so
            // the collider doesn't really matter anyway.
            DestroyImmediate(go.GetComponent<BoxCollider>());

            // Use the triangulator to get indices for creating triangles
            int[] indices = Triangulation.Triangulate(collider.points.ToList()).ToArray();

            // convert vector2 points to vector3 vertices
            var vertices = collider.points.Select(p => new Vector3(p.x, 0, p.y)).ToList();

            // create mesh
            var mesh = new Mesh();
            mesh.vertices = vertices.ToArray();
            mesh.triangles = indices;
            //mesh.RecalculateNormals();
            mesh.RecalculateBounds();

            // assign it to the mesh filter
            go.GetComponent<MeshFilter>().sharedMesh = mesh;

            MakeUnwalkable(go);
        }
    }

    void AddEdgeCollider2Ds(Transform parent)
    {
        // find all valid colliders, add them to projection
        var colliders = GameObject.FindObjectsOfType<EdgeCollider2D>();
        var filtered = colliders.Where(co => IsValidCollider(co)).ToList();
        foreach (var collider in filtered)
        {
            // note: creating a primitive is necessary in order for it to bake properly
            var go = GameObject.CreatePrimitive(PrimitiveType.Cube);
            go.isStatic = true;
            go.transform.parent = parent;

            // position via offset and transformpoint
            var localPos = new Vector3(collider.offset.x, collider.offset.y, 0);
            var worldPos = collider.transform.TransformPoint(localPos);
            go.transform.position = new Vector3(worldPos.x, 0, worldPos.y);
            // scale depending on scale * collider size (circle=radius/box=size/...)
            go.transform.localScale = NavMeshUtils2D.ScaleFromEdgeCollider2D(collider);
            // rotation
            go.transform.rotation = Quaternion.Euler(NavMeshUtils2D.RotationTo3D(collider.transform.eulerAngles));

            // remove box collider. note that baking uses the meshfilter, so
            // the collider doesn't really matter anyway.
            DestroyImmediate(go.GetComponent<BoxCollider>());

            // create mesh from edgecollider2D by stepping through each point
            // and creating a triangle with point, point-1 and point-1 with y=1
            List<Vector3> vertices = new List<Vector3>();
            List<int> indices = new List<int>();

            // start at 2nd point so we can use the first one in our triangle,
            for (int i = 1; i < collider.points.Length; ++i)
            {
                Vector2 a2D = collider.points[i-1];
                Vector2 b2D = collider.points[i];

                // convert to 3D
                //   point A
                //   point B
                //   point C := A with y+1
                Vector3 a3D = new Vector3(a2D.x, 0, a2D.y);
                Vector3 b3D = new Vector3(b2D.x, 0, b2D.y);
                Vector3 c3D = new Vector3(a2D.x, 1, a2D.y);

                // add 3 vertices
                vertices.Add(a3D);
                vertices.Add(b3D);
                vertices.Add(c3D);

                // add last 3 vertices as indices
                indices.Add(vertices.Count - 1);
                indices.Add(vertices.Count - 2);
                indices.Add(vertices.Count - 3);
            }

            // create mesh
            var mesh = new Mesh();
            mesh.vertices = vertices.ToArray();
            mesh.triangles = indices.ToArray();
            //mesh.RecalculateNormals();
            mesh.RecalculateBounds();

            // assign it to the mesh filter
            go.GetComponent<MeshFilter>().sharedMesh = mesh;

            MakeUnwalkable(go);
        }
    }

#if UNITY_2017_2_OR_NEWER
    void AddTilemapCollider2Ds(Transform parent)
    {
        // find all grids
        Grid[] grids = GameObject.FindObjectsOfType<Grid>();
        foreach (Grid grid in grids)
        {
            // find tilemaps (we only care about those that have colliders)
            var tilemaps = grid.GetComponentsInChildren<Tilemap>().Where(
                tm => tm.GetComponent<TilemapCollider2D>()
            ).ToList();

            foreach (Tilemap tilemap in tilemaps)
            {
                // go through each cell
                BoundsInt bounds = tilemap.cellBounds;
                for (int y = bounds.position.y; y < bounds.size.y; ++y)
                {
                    for (int x = bounds.position.x; x < bounds.size.x; ++x)
                    {
                        // find out if it has a collider
                        Vector3Int cellPosition = new Vector3Int(x, y, 0);
                        if (tilemap.GetColliderType(cellPosition) != Tile.ColliderType.None)
                        {
                            // convert to world space
                            Vector3 worldPosition = tilemap.GetCellCenterWorld(cellPosition);

                            // note: creating a primitive is necessary in order for it to bake properly
                            var go = GameObject.CreatePrimitive(PrimitiveType.Cube);
                            go.isStatic = true;
                            go.transform.parent = parent;
                            // position via offset and transformpoint
                            go.transform.position = new Vector3(worldPosition.x, 0, worldPosition.y);
                            // scale depending on scale * collider size (circle=radius/box=size/...)
                            go.transform.localScale = NavMeshUtils2D.ScaleTo3D(tilemap.transform.localScale);
                            // rotation
                            go.transform.rotation = Quaternion.Euler(NavMeshUtils2D.RotationTo3D(tilemap.transform.eulerAngles));

 MakeUnwalkable(go);
                        }
                    }
                }
            }
        }
    }
#endif

    void BakeNavMesh2D()
    {
        // create a temporary parent GameObject
        var obj = new GameObject();

        // find all static box colliders, add them to projection
        AddBoxCollider2Ds(obj.transform);
        // find all static circle colliders, add them to projection
        AddCircleCollider2Ds(obj.transform);
        // find all static polygon colliders, add them to projection
        AddPolygonCollider2Ds(obj.transform);
        // find all edge polygon colliders, add them to projection
        AddEdgeCollider2Ds(obj.transform);
        // find all tilemap colliders, add them to projection
#if UNITY_2017_2_OR_NEWER
        AddTilemapCollider2Ds(obj.transform);
#endif

        // min and max point from 2D colliders projected to 3D.
        // (scanning through 3D colliders doesn't work well because the polygon
        //  GameObjects are pure meshes without colliders)
        var cols = GameObject.FindObjectsOfType<Collider2D>();
        if (cols.Length > 0)
        {
            var min = new Vector2(Mathf.Infinity, Mathf.Infinity);
            var max = -min;
            foreach (var c in cols)
            {
                var minmax = NavMeshUtils2D.AdjustMinMax(c, min, max);
                min = minmax[0];
                max = minmax[1];
            }

            // create ground (cube instead of plane because it has unit size)
            // (pos between min and max; scaled to fit min and max * scale)
            // note: scale.y=0 so that *navmeshExtends doesn't make it too high
            var go = GameObject.CreatePrimitive(PrimitiveType.Cube);
            go.name = "Ground"; // for debugging
            go.isStatic = true;
            go.transform.parent = obj.transform;
            float w = max.x - min.x;
            float h = max.y - min.y;
            go.transform.position = new Vector3(min.x + w/2, -0.5f, min.y + h/2);
            go.transform.localScale = new Vector3(w, 0, h) * navmeshExtends;
        }


        // bake navmesh asynchronously, clear mesh
        UnityEditor.AI.NavMeshBuilder.BuildNavMeshAsync(); // Async causes weird results
        if (gizmesh != null) gizmesh.Clear();
        needsRebuild = true; // rebuild as soon as async baking is finished

        // delete the gameobjects now that the path was created
        GameObject.DestroyImmediate(obj);
    }

    // editor window ///////////////////////////////////////////////////////////
    [MenuItem("Window/Navigation2D")]
    public static void ShowWindow()
    {
        // Show existing window instance. If one doesn't exist, make one.
        EditorWindow.GetWindow(typeof(Navigation2D));
    }

    static Texture2D logo
    {
        get
        {
            return (Texture2D)EditorGUIUtility.Load("Assets/Navigation2D/logo.png");
        }
    }

    void OnGUI()
    {
        GUILayout.BeginVertical();

        // colored logo
        //var backup = GUI.backgroundColor;
        //GUI.backgroundColor = Color.white;
        //GUILayout.BeginVertical("box");
        GUILayout.Label(logo, new GUIStyle(GUI.skin.label){alignment=TextAnchor.MiddleCenter});
        //GUILayout.EndVertical();
        //GUI.backgroundColor = backup;
        GUILayout.Label("<b>by noobtuts.com</b>", new GUIStyle(GUI.skin.label){richText=true,alignment=TextAnchor.MiddleCenter});

        // instructions
        EditorGUILayout.Space();
        EditorGUILayout.LabelField("Instructions", EditorStyles.boldLabel);
        EditorGUILayout.HelpBox(@"1. Make your 2D Colliders Static
2. Press Bake and wait until it's done
3. Add NavMeshAgent2D to agents", MessageType.Info);
        EditorGUILayout.Space();

        // get access to original navigation settings
        // (that's how Unity's Navigation window does it too)
        var settings = new SerializedObject(UnityEditor.AI.NavMeshBuilder.navMeshSettingsObject);
        SerializedProperty agentRadius = settings.FindProperty("m_BuildSettings.agentRadius");
        SerializedProperty agentHeight = settings.FindProperty("m_BuildSettings.agentHeight");

        // settings header
        EditorGUILayout.Space();
        EditorGUILayout.LabelField("Settings", EditorStyles.boldLabel);

        // diagram
        Rect controlRect = EditorGUILayout.GetControlRect(false, 120f, new GUILayoutOption[0]);
        NavMeshEditorHelpers.DrawAgentDiagram(controlRect, agentRadius.floatValue, agentHeight.floatValue, 0, 0);

        // agent radius
        agentRadius.floatValue = EditorGUILayout.FloatField(new GUIContent("Agent Radius", "Modifies the built in Agent Radius from Window->Navigation"), agentRadius.floatValue);
        settings.ApplyModifiedProperties();

        // ground extends
        navmeshExtends = EditorGUILayout.Slider(new GUIContent("NavMesh Extends", "Can be used to cover the outside of your scene with a NavMesh"), navmeshExtends, 1, 100);

        // visibility
        drawMode = EditorGUILayout.IntPopup("Mode", drawMode, new string[]{"Wireframe", "Full"}, new int[]{0, 1, 2});

        // repaint scene if drawMode option changed
        if (GUI.changed)
            SceneView.RepaintAll();

        // buttons
        EditorGUILayout.Space();
        GUILayout.BeginHorizontal();
        GUILayout.FlexibleSpace();
        if (GUILayout.Button("Clear", GUILayout.Width(95f)))
        {
            UnityEditor.AI.NavMeshBuilder.ClearAllNavMeshes();
            if (gizmesh != null) gizmesh.Clear();
        }
        if (UnityEditor.AI.NavMeshBuilder.isRunning)
        {
            if (GUILayout.Button("Cancel", GUILayout.Width(95f))) UnityEditor.AI.NavMeshBuilder.Cancel();
        }
        else
        {
            if (GUILayout.Button("Bake", GUILayout.Width(95f))) BakeNavMesh2D();
        }
        GUILayout.EndHorizontal();

        GUILayout.EndVertical();
    }

    // save & load editor settings /////////////////////////////////////////////
    void LoadSettings()
    {
        if (EditorPrefs.HasKey("Navigation2D_navmeshExtends"))
            navmeshExtends = EditorPrefs.GetFloat("Navigation2D_navmeshExtends");

        if (EditorPrefs.HasKey("Navigation2D_drawMode"))
            drawMode = EditorPrefs.GetInt("Navigation2D_drawMode");
    }

    void SaveSettings()
    {
        EditorPrefs.SetFloat("Navigation2D_navmeshExtends", navmeshExtends);
        EditorPrefs.SetInt("Navigation2D_drawMode", drawMode);
    }

    void OnFocus()
    {
        LoadSettings();
    }

    void OnLostFocus()
    {
        SaveSettings();
    }

    void OnDestroy()
    {
        SaveSettings();
    }

    // visibility //////////////////////////////////////////////////////////////
    // simple helper to find out if the window is currently visible or not
    static bool visible = false;

    public void OnBecameVisible()
    {
        // repaint scene view to refresh gizmo when we show the window
        // otherwise it's only refreshed when clicking into the scene view again
        SceneView.RepaintAll();
        visible = true;
    }

    public void OnBecameInvisible()
    {
        // repaint scene view to refresh gizmo when we hide the window
        // otherwise it's only refreshed when clicking into the scene view again
        SceneView.RepaintAll();
        visible = false;
    }

    // gizmo ///////////////////////////////////////////////////////////////////
    static bool needsRebuild = false;
    static Mesh gizmesh;
    static void RebuildGizmesh(NavMeshTriangulation nm)
    {
        // the mesh is cleared after stopping the game, rebuild if necessary
        if (!gizmesh) gizmesh = new Mesh();
        gizmesh.vertices = nm.vertices.Select(v => new Vector3(v.x, v.z, 0)).ToArray(); // TODO utils?
        gizmesh.triangles = nm.indices;
        gizmesh.normals = gizmesh.vertices.Select(_ => new Vector3(0, 0, -1)).ToArray();
        needsRebuild = false;
    }

    [DrawGizmo(GizmoType.Selected | GizmoType.NonSelected)]
    static void OnGizmo(Transform tf, GizmoType gt)
    {
        // only show navmesh while the window is visible
        // Gizmos.Draw is slow, so only do it when the user really needs it.
        // otherwise bigger games would be slow all the time.
        if (!visible) return;

        // rebuild if necessary
        if (!gizmesh || needsRebuild)
            if (!UnityEditor.AI.NavMeshBuilder.isRunning)
                RebuildGizmesh(NavMesh.CalculateTriangulation());

        // draw if not empty
        if (gizmesh.vertices.Length > 0)
        {
            Gizmos.color = Color.cyan;
            if (drawMode == 0)
            {
                Gizmos.DrawWireMesh(gizmesh);
            }
            else if (drawMode == 1)
            {
                Gizmos.DrawMesh(gizmesh);
                Gizmos.DrawWireMesh(gizmesh);
            }
        }
    }
}
Nowsfeky
Nowsfeky
Iniciante
Iniciante

Masculino PONTOS : 297
REPUTAÇÃO : 5
Idade : 32
Áreas de atuação : Iniciante em programação C#.
Respeito as regras : Ajuda com script movimento por Grid Tile no Navmesh WvDYdlf

Ver perfil do usuário

Voltar ao Topo Ir em baixo

PEDIDO Re: Ajuda com script movimento por Grid Tile no Navmesh

Mensagem por NKKF em Qui Out 04, 2018 6:48 pm

Acho que é melhor você pedir suporte ao dono do Asset pago.
NKKF
NKKF
ProgramadorMaster

Masculino PONTOS : 2417
REPUTAÇÃO : 462
Idade : 14
Áreas de atuação : Error 404 Not Found.
Respeito as regras : Ajuda com script movimento por Grid Tile no Navmesh Aad8pUi

Ver perfil do usuário http://www.projetounity.esy.es

Voltar ao Topo Ir em baixo

PEDIDO Re: Ajuda com script movimento por Grid Tile no Navmesh

Mensagem por Nowsfeky em Qui Out 04, 2018 7:02 pm

Ai é que ta o problema. Paguei e ele disse que agora não tinha tempo para dar suporte. Afffff.
Então tive que buscar recursos. Se alguém puder ajudar. Sou iniciante ainda em C#.
Nowsfeky
Nowsfeky
Iniciante
Iniciante

Masculino PONTOS : 297
REPUTAÇÃO : 5
Idade : 32
Áreas de atuação : Iniciante em programação C#.
Respeito as regras : Ajuda com script movimento por Grid Tile no Navmesh WvDYdlf

Ver perfil do usuário

Voltar ao Topo Ir em baixo

PEDIDO Re: Ajuda com script movimento por Grid Tile no Navmesh

Mensagem por dstaroski em Qui Out 04, 2018 8:05 pm

@Nowsfeky escreveu:Ai é que ta o problema. Paguei e ele disse que agora não tinha tempo para dar suporte. Afffff.
Então tive que buscar recursos. Se alguém puder ajudar. Sou iniciante ainda em C#.
Boa noite cara! olha, é complexo demais os códigos para interpretar sem estar com o Asset completo em cena. Porém, se você comprou, o desenvolvedor é OBRIGADO a te dar o suporte, caso contrário, você poderá denuncia-lo se reportando também ao suporte da Unity a respeito da falta de suporte do desenvolvedor.

Abraço!
dstaroski
dstaroski
Instrutor

Masculino PONTOS : 4222
REPUTAÇÃO : 1082
Idade : 29
Áreas de atuação : Desenvolvedor .NET Jr. ,Téc. Hardware e Redes, Programação C#, Asp .NET, HTML, CSS, Unity 3D

Respeito as regras : Ajuda com script movimento por Grid Tile no Navmesh Aad8pUi

Ver perfil do usuário http://diegodeoliveira.gamejolt.io/defeattheilluminatis

Voltar ao Topo Ir em baixo

PEDIDO Re: Ajuda com script movimento por Grid Tile no Navmesh

Mensagem por Nowsfeky em Sex Out 05, 2018 9:12 am

Bom dia dstaroski ! Pedi ajuda a ele e a única coisa que ele falou para eu fazer foi o seguinte:

Modify your player's movement script to always set agent.destination = (1,1) or (2,3) etc


Mas não entendi muito bem o que fazer. Vc ou alguem poderia me ajudar?
Nowsfeky
Nowsfeky
Iniciante
Iniciante

Masculino PONTOS : 297
REPUTAÇÃO : 5
Idade : 32
Áreas de atuação : Iniciante em programação C#.
Respeito as regras : Ajuda com script movimento por Grid Tile no Navmesh WvDYdlf

Ver perfil do usuário

Voltar ao Topo Ir em baixo

PEDIDO Re: Ajuda com script movimento por Grid Tile no Navmesh

Mensagem por dstaroski em Sex Out 05, 2018 10:29 am

@Nowsfeky escreveu:Bom dia dstaroski ! Pedi ajuda a ele e a única coisa que ele falou para eu fazer foi o seguinte:

Modify your player's movement script to always set agent.destination = (1,1) or (2,3) etc


Mas não entendi muito bem o que fazer. Vc ou alguem poderia me ajudar?
putz cara, também não entendi direito, tenta por esses valores como distancia de parada do destino para ver se ajuda.

Abraço!
dstaroski
dstaroski
Instrutor

Masculino PONTOS : 4222
REPUTAÇÃO : 1082
Idade : 29
Áreas de atuação : Desenvolvedor .NET Jr. ,Téc. Hardware e Redes, Programação C#, Asp .NET, HTML, CSS, Unity 3D

Respeito as regras : Ajuda com script movimento por Grid Tile no Navmesh Aad8pUi

Ver perfil do usuário http://diegodeoliveira.gamejolt.io/defeattheilluminatis

Voltar ao Topo Ir em baixo

PEDIDO Re: Ajuda com script movimento por Grid Tile no Navmesh

Mensagem por Nowsfeky em Sex Out 05, 2018 10:40 am

Se eu colocar esses valores em destino, ai não importa onde eu clico no mapa, o player sempre vai para essa mesma coordenada. Pelo que eu entendi não preciso mexer na lógica do asset  e sim apenas no script do player. Pois o asset dele apenas converte o recurso Navigation 3D do Unity para 2D.

Pois o movimento pelo teclado é até simples e usado pela maioria mas quero que o player pare sempre no meio do tile, ou seja, quando aperto e solto a seta quero que ele saia do meio do tile e pare exatamente no meio do outro.
Nowsfeky
Nowsfeky
Iniciante
Iniciante

Masculino PONTOS : 297
REPUTAÇÃO : 5
Idade : 32
Áreas de atuação : Iniciante em programação C#.
Respeito as regras : Ajuda com script movimento por Grid Tile no Navmesh WvDYdlf

Ver perfil do usuário

Voltar ao Topo Ir em baixo

PEDIDO Re: Ajuda com script movimento por Grid Tile no Navmesh

Mensagem por dstaroski em Sex Out 05, 2018 11:20 am

@Nowsfeky escreveu:Se eu colocar esses valores em destino, ai não importa onde eu clico no mapa, o player sempre vai para essa mesma coordenada. Pelo que eu entendi não preciso mexer na lógica do asset  e sim apenas no script do player. Pois o asset dele apenas converte o recurso Navigation 3D do Unity para 2D.

Pois o movimento pelo teclado é até simples e usado pela maioria mas quero que o player pare sempre no meio do tile, ou seja, quando aperto e solto a seta quero que ele saia do meio do tile e pare exatamente no meio do outro.
entendi, bom cara, eu já não tenho mais como te ajudar, ainda mais que é um código complexo e tals, acho que você deve ir testando e pesquisando a respeito do Asset, e enche o saco do desenvolvedor também para te auxiliar.

Abraço!
dstaroski
dstaroski
Instrutor

Masculino PONTOS : 4222
REPUTAÇÃO : 1082
Idade : 29
Áreas de atuação : Desenvolvedor .NET Jr. ,Téc. Hardware e Redes, Programação C#, Asp .NET, HTML, CSS, Unity 3D

Respeito as regras : Ajuda com script movimento por Grid Tile no Navmesh Aad8pUi

Ver perfil do usuário http://diegodeoliveira.gamejolt.io/defeattheilluminatis

Voltar ao Topo Ir em baixo

PEDIDO Re: Ajuda com script movimento por Grid Tile no Navmesh

Mensagem por Nowsfeky em Sex Out 05, 2018 11:27 am

OK. Vlw.
Nowsfeky
Nowsfeky
Iniciante
Iniciante

Masculino PONTOS : 297
REPUTAÇÃO : 5
Idade : 32
Áreas de atuação : Iniciante em programação C#.
Respeito as regras : Ajuda com script movimento por Grid Tile no Navmesh WvDYdlf

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum