Jump to content
UnitySpain

Aceptamos donaciones vía Paypal.

UnitySpain.com es un servicio gratuito, pero mantener la Comunidad conlleva una serie de gastos.

Fondo Anual Unityspain: Donados 58,34€ de 150,00€

  • Servidor: Dominio.com y Hosting Web
  • Mantenimiento de los Foros
  • Contenido y Servicios Extras
  • Mantenimiento para Redes Sociales
Casti23

Ayuda, select to move

Recommended Posts

hola compañeros, tengo una duda sobre si es posible o no realizar este planteamiento:

En mi proyeto controlas a una nave que va de planeta en planeta(vijando entre diversos sistemas solares), los planetas giran al rededor del sol, y la nave estara orbitando al rededor del  planeta hasta que te desplaces a otro planeta gastando enerjia, el movimiento es parecido a un click to move, pero tienes que seleccionar un planeta para moverte.

Mi planteamiento es crear un objeto vacio que orbite en cada planeta, la nave(como un objeto aparte) comienza asociado a uno, y cuando selecciona otro planeta se desasocia, se mueve hasta el siguiente punto y se asocia al que esta orbitando en el otro planeta.

lo unico que he conseguido es hacer un movimiento click to move, donde pinchas sobre un planeta y se mueve a la cordenada aun que el planeta siga desplazandose.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class controler : MonoBehaviour
{
    public GameObject cam;//maincamera
    public GameObject camPos;//empty object associated with the camera to track  
    public GameObject targetPos;//worcks like a objetive market
    public GameObject eyePos;//object that traces a straight line with the objective to identify if there is an obstacle
    public GameObject ostaculePos;//worcks like a obstacule market

    Vector3 newpos;
    bool moving;
    void start()
    {
        moving = false;
    }
    void update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hitplanet;
            RaycastHit hitsun;
            Ray ray = cam.GetComponent<Camera>().ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hitplanet))
            {
                if (hitplanet.collider.CompareTag("planetas"))
                {
                    newpos = hitplanet.point;
                    targetPos.transform.position = newpos;
                    camPos.transform.SetParent(null);
                    transform.LookAt(new Vector3(newpos.x, transform.position.y, newpos.z));
                    camPos.transform.SetParent(transform);
                    if (Physics.Raycast(eyePos.transform.position, newpos - eyePos.transform.position, out hitsun, Vector3.Distance(transform.position, newpos)))
                    {
                        if (hitsun.collider.CompareTag("sol"))
                        {
                            ostaculePos.transform.position = hitsun.point;
                            Debug.Log("Sun in the middle of the path");
                        }
                        else
                        {
                            moving = true;
                        }
                    }
                    else
                    {
                        moving = true;
                    }

                }
            }
        }
        if (moving == true)
        {
            transform.Translate(new Vector3(0, 0, 100f));
            if (Vector3.Distance(transform.position, newpos) < 50f)
            {
                moving = false;
            }
        }
        cam.transform.position = Vector3.Lerp(cam.transform.position, camPos.transform.position,0.1f);
    }
   
    
}

tambien tengo el codigo de traslacion y rotacion de los planetas.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Traslacion : MonoBehaviour
{
    int factor = 12;
    public long timeAround;
    public Transform origin;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.RotateAround(origin.position, Vector3.down, 360.0f / (timeAround / factor) * Time.deltaTime);
    }
}

inserto el de traslacion por que es el  importante.

Gracias de ante mano.

 

Share this post


Link to post
Share on other sites
3 hours ago, Casti23 said:

Mi planteamiento es crear un objeto vacio que orbite en cada planeta, la nave(como un objeto aparte) comienza asociado a uno, y cuando selecciona otro planeta se desasocia, se mueve hasta el siguiente punto y se asocia al que esta orbitando en el otro planeta.

Hola, sí, es totalmente posible, aunque para eso no necesitas un objeto por planeta orbitando, con algebra vectorial lo podés lograr. Osea, si conocés la posición de todos los planetas (con tenerlos referenciados alcanza) podés crear un vector centro-órbita y de ahí rotar dicho vector. Podrías hacer (espero que funcione):

//supongo que cada planeta tiene uno de estos

[SerializeField]
float orbitDistance = 10f;

Vector3 targetOrbitPoint;

//quien controle a la nave puede pedir este valor, no modifcarlo, es un getter
public Vector3 TargetOrbitPoint{ get{ return targetOrbitPoint; } }  

Vector3 centerToOrbit;

void Start()
{	
	centerToOrbit = Vector3.right * orbitDistance (por ej, a la derecha alejado lo que le pongas) 
}

void Update()
{   

    //Para rotar un vector se hace lo siguiente (algebra matricial pura)
    //angle es tu angulo final, por ej con angular speed, en tu ejemplo sería = 360.0f / (timeAround / factor)
    angle = angularSpeed * Time.deltaTime;
    
	Quaternion rotation = Quaternion.AngleAxis( angle , Vector3.forward ); //le puse forward pero ponele el eje que quieras
    
	//rotás el vector
	centerToOrbit = rotation * centerToOrbit;

	// actualizar el dato de interés
    targetOrbitPoint = transform.position + centerToOrbit;
 
	//Para debuguear <---
	Debug.DrawRay( transform.position , centerToOrbit , Color.Magenta );

}

 

a lo que subiste lo toqué un poco, no arreglé ni vi mucho, solamente cambié que algunas variables se llamaban "___Pos" cuando eran GameObjects (difícil de leer, sobretodo si tenés cosas como "camPos.transform.position") y ese GetComponent<Camera> lo podés catchear antes, por lo menos para este caso, no es que haga mucho pero igual.

public class controler : MonoBehaviour
{
	public Camera cam;   //<---MOD 
    public Transform camTransform;   //<---MOD
	
    public Transform camPos;//empty object associated with the camera to track  
    public GameObject targetTransform; //por qué  se llamaba "Pos" si era un GameObject?
    public GameObject eyeTransform; //IDem anterior
    public GameObject ostaculeTransform;//IDem anterior
	
  	//Seguramente uses mucho más el transform que el gameObject, por eso son transforms  	
    Vector3 newpos;
    bool moving;

    void start()
    {
        moving = false;
		cam = camTransform.GetComponent<Camera>();

    }
    void update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hitplanet;
            RaycastHit hitsun;
          
            Ray ray = cam.ScreenPointToRay(Input.mousePosition); //<---MOD
            if (Physics.Raycast(ray, out hitplanet))
            {
                if (hitplanet.collider.CompareTag("planetas"))
                {
                    newpos = hitplanet.point;
                    targetTransform.position = newpos;
                    camTransform.SetParent(null);
                    transform.LookAt(new Vector3(newpos.x, transform.position.y, newpos.z));
                    camTransform.SetParent(transform);
                  
                    if (Physics.Raycast(eyeTransform.position, newpos - eyeTransform.position, out hitsun, Vector3.Distance(transform.position, newpos)))
                    {
                        if (hitsun.collider.CompareTag("sol"))
                        {
                            ostaculeTransform.position = hitsun.point;
                            Debug.Log("Sun in the middle of the path");
                        }
                        else
                        {
                            moving = true;
                        }
                    }
                    else
                    {
                        moving = true;
                    }

                }
            }
        }
        if (moving == true)
        {
            transform.Translate(new Vector3(0, 0, 100f));
            if (Vector3.Distance(transform.position, newpos) < 50f)
            {
                moving = false;
            }
        }
        camTransform.position = Vector3.Lerp(camTransform.position, camTransform.position,0.1f);
    }
   
    
}

 

Saludos

Share this post


Link to post
Share on other sites

Gracias Compañero, voy a realizar pruebas, y a ver si me funciona

 

Share this post


Link to post
Share on other sites

×
×
  • Create New...