Creare Videogiochi - Game Developer
Teletrasportare un oggetto su unity 3d? - Versione stampabile

+- Creare Videogiochi - Game Developer (https://www.making-videogames.net/giochi)
+-- Forum: Unity3D Italia (https://www.making-videogames.net/giochi/Forum-Unity3D-Italia)
+--- Forum: Richieste di Aiuto per Unity 3D (https://www.making-videogames.net/giochi/Forum-Richieste-di-Aiuto-per-Unity-3D)
+--- Discussione: Teletrasportare un oggetto su unity 3d? (/thread-Teletrasportare-un-oggetto-su-unity-3d)



Teletrasportare un oggetto su unity 3d? - zodanilbello - 10-12-2014

Salve a tutti, sto creando un gioco per smartphone ma mi servirebbe teletrasportare l'oggetto dove l'utente clicca... non so veramente come fare e che script scrivere... aiuti? Huh


RE: Teletrasportare un oggetto su unity 3d? - Blackg96 - 11-12-2014

non conosco affatto le librerie smartphone


RE: Teletrasportare un oggetto su unity 3d? - Chip - 11-12-2014

non mi intendo di unity per mobile ma non c'e la Touch.position? di preciso cosa stai facendo? poi sei in 3d o 2d?


RE: Teletrasportare un oggetto su unity 3d? - zodanilbello - 11-12-2014

sono in 2d... ho messo che un aeroplano va avanti e vorrei che con il click si teletrasportasse nel punto selezionato... come faccio?


RE: Teletrasportare un oggetto su unity 3d? - Chip - 11-12-2014

mhh in 2D su un smartphone, la butto li
Codice:
Vector3 arrivo = Camera.main.ScreenToWorldPoint([b]Input.mousePosition[/b]);
arrivo.z = 0; // non serve
gameObject.transform.position = arrivo; //in generale la trasform dell'oggetto che muovi

Cambia Input.mousePosition con Touch.position e vedi che succede, purtroppo non ho gli strumenti per sviluppare su cellulari.

Il punto chiave è la ScreenToWorldPoint che trasforma le coordinate del mouse X,Y su schermo con origine in basso a sinistra in coordinate world. Ottenute le nuove wX,wY usi la Trasform.poition che istantaneamente sposta l'oggetto alle nuove coordinate world.

http://docs.unity3d.com/ScriptReference/Transform.html
http://docs.unity3d.com/ScriptReference/Camera.ScreenToWorldPoint.html
http://docs.unity3d.com/ScriptReference/Touch.html


RE: Teletrasportare un oggetto su unity 3d? - eoasier - 11-12-2014

Io uno script per teletrasportare il player l'ho creato per il mio gioco e sono veramente 2 righe di codice... Hi usato UK JavaScript mi sembra. Però il mio teletrasporto funziona solo in determinate aree della mappa già prestabilite. Per la conversione dello script a mobile dovrebbe pensarci il compiler di unity


RE: Teletrasportare un oggetto su unity 3d? - zodanilbello - 12-12-2014

grazie ora provo... un altra cosa, e come faccio a fare che piu' tengo premuto piu' il personaggio va in su (asse y)? magari mettendo un limite anche


RE: Teletrasportare un oggetto su unity 3d? - Chip - 12-12-2014

mhh direi di muovermi verso il Touch.Phase o forse il Touch.deltatime (che però credo serva alla velocità quando il dito touch è in movimento).
http://docs.unity3d.com/ScriptReference/Touch-phase.html
Forse preferisci il C#
Codice:
void Update ()
{
   int nrTocchi = Input.touchCount;
   if(nrTocchi > 0)
   {
      for (int i = 0; i < nrTocchi; i++)
      {
         Touch miotocco = Input.GetTouch(i);
         TouchPhase miafase = miotocco.phase;
         switch(miafase)
         {
            case TouchPhase.Began:
               print("Nuovo tocco in " + miotocco.position + " , dito nr." + miotocco.fingerId);
               break;
            case TouchPhase.Moved:
               print("dito nr. " + miotocco.fingerId + " mosso di " + miotocco.deltaPosition);
               break;
            case TouchPhase.Stationary:
               print("dito nr. " + miotocco.fingerId + " fermo " + miotocco.position);
               break;
            case TouchPhase.Ended:
               print("dito nr. " + miotocco.fingerId + " uscito in " + miotocco.position);
               break;
            case TouchPhase.Canceled:
               print("dito nr. " + miotocco.fingerId + " finito");
                break;
            }
        }
   }
}



RE: Teletrasportare un oggetto su unity 3d? - zodanilbello - 12-12-2014

Ma da quel codice devo aggiungere tipo questa cosa per farlo muovere?

using UnityEngine;
using System.Collections;

public class Controller : MonoBehaviour {

private float hspeed, vspeed; // velocità orrizzontale e verticale
private const float SPEED = 2; // velocità massima del movimento

void Start () {
// Inizialmente il personaggio non si muove -> le velocità sono = 0!
hspeed = 0;
vspeed = 0;

}

void Update () {

if (Input.GetKey ("left")) {
hspeed = -SPEED;
} else if (Input.GetKey("right")) {
hspeed = SPEED;
} else {
hspeed = 0;
}

rigidbody2D.velocity = new Vector3(hspeed, rigidbody2D.velocity.y, 0);

}
}


RE: Teletrasportare un oggetto su unity 3d? - Chip - 12-12-2014

Qui ti riferisci alla seconda domanda vero? perché qui non teletrasporta ma muove di velocità lineare y (ma la rigidbody2d.velocity non è un vector2? boh? ).

Però qui usi la GetKey, non so come funziona con i touch degli smartphone. Comunque se vuoi che finché si tiene premuto il tasto "su" la velocità insista di SPEED, allora ti serve il Input.GetKeyDown e Input.GetKeyUp per sapere quando inizia e finisce di premere il tasto.

http://docs.unity3d.com/ScriptReference/Rigidbody2D-velocity.html
http://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html
http://docs.unity3d.com/ScriptReference/Input.GetKeyUp.html
http://unity3d.com/learn/tutorials/modules/beginner/scripting/get-button-and-get-key

Poi forse è ancora meglio la getAxis con cui ti prendi fin da subito il -1 +1 e non devi decidere se ha premuto a destra o a sinistra Big Grin
http://unity3d.com/learn/tutorials/modules/beginner/scripting/get-axis


RE: Teletrasportare un oggetto su unity 3d? - zodanilbello - 12-12-2014

Si un getaxis sembra appropriato:
using UnityEngine;
using System.Collections;

public class ABC : MonoBehaviour
{
public float range;
public GUIText textOutput;


void Update ()
{
float h = Input.GetAxis("Horizontal");
float xPos = h * range;

transform.position = new Vector3(xPos, 2f, 0);
textOutput.text = "Value Returned: "+h.ToString("F2");
}
}

Però il personaggio non si muove.. cosa devo aggiungere? (non me ne intendo molto di script)


RE: Teletrasportare un oggetto su unity 3d? - Chip - 12-12-2014

lo script è associato all'asset che vuoi muovere vero? il nome ABC lo cambierei in qualcosa di piu sensato cone playermoviment . altra cosa "h" è public quindi se è uno script associato ad un asset dovrebbe essere visibile nell'ispector, quanto vale "h"? se no devi usare la start() per inizializzare h con qualcosa e verrà eseguita al primo frame assoluto


RE: Teletrasportare un oggetto su unity 3d? - zodanilbello - 13-12-2014

ok... cmq abc l'ho messo temporaneo per vedere se funzionava xD


RE: Teletrasportare un oggetto su unity 3d? - Chip - 13-12-2014

ok Big Grin ma alla fin fine cosa stai facendo? un Lander? perché devi tenere premuto per stare in alto? flappybird? Big Grin


RE: Teletrasportare un oggetto su unity 3d? - zodanilbello - 13-12-2014

Ma a me proprio non vaaaaa!!! Allora ricapitolando: devo fare un giochino in 2d e vorrei fare che piu' il soggetto clicca piu' il personaggio va in alto, se io smetto di cliccare il soggetto deve smettere di andare in alto e cadere... però non riesco a fare come ti ho detto... per caso non puoi farlo tu da 0 per me (lo script che piu' tengo premuto piu' va in alto)? perché a me non viene... attenzione NON voglio l'effetto flappy bird che devo continuare a cliccare, quello sono capace pure io


RE: Teletrasportare un oggetto su unity 3d? - Chip - 13-12-2014

Quindi un oggetto che tenderebbe a cadere ma se clicco su di esso e tengo premuto questo va su? Ovviamente la pressione deve insistere sempre sul pezzo quindi il dito (lo faccio col mouse) deve comunque seguire il pezzo?


RE: Teletrasportare un oggetto su unity 3d? - Chip - 14-12-2014

Prendi due sprite
Il lander: http://opengameart.org/content/eye-lander
un backgroud: http://opengameart.org/content/background-dark-city

Crea un nuovo progetto 2D (non faccio 2D in Unity quindi mi sono limitato a usare il progetto di unity)

Crea le solite 4 cartelle (perché siamo personcine precise Big Grin ) Scripts, Textures, Prebas, Scenes
Ficca le due immagini in \Textures\ poi trascinale sulla scena avendo cura di scalare lo sfondo e di mettere il player ad una z= -1 così va sopra a tutto un pò pecoreccio ma meglio di niente.

Aggiungi al player un RigidBody2D (altrimenti tocca a gestire tutta la fisica a manella via codice) se non vuoi che l'oggetto cada toglie la gravità.

Crea un nuovo script per il player, chiamalo PlayerController (o come vuoi). O lo aggiungi direttamente dall'inspector con il player attivo oppure crealo nella cartella Script e poi trascinalo sul player.

Scrivi questo codice:
Codice:
using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour {

    public Vector2 v2muovi = new Vector2(0f,0f);
    public float horizontalSpeed = 0.0f;
    public float verticalSpeed = 0.0f;

    // Use this for initialization
    //void Start () {
    //
    //}
    
    // Update is called once per frame
    void Update ()
    {
        //prendo assi e ottengo il (-1..+1) poi moltiplico per la velocità
        float h = horizontalSpeed * Input.GetAxis("Horizontal");
        float v = verticalSpeed * Input.GetAxis("Vertical");
        //azzero la forza altrimenti diventa un missile
        rigidbody2D.velocity=Vector2.zero;
        //il mio vettore pari alle
        v2muovi.x=h;
        v2muovi.y=v;
        //applica la forza di vettore 2D (v,h)
        rigidbody2D.AddForce(v2muovi);
    }
}

Preimposta da Unity V2muovi a 0,0 e 50 per la velocità hor e vert a me va decentemente.


RE: Teletrasportare un oggetto su unity 3d? - zodanilbello - 14-12-2014

Bene perfetto, ora ti chiedendo un ultimo favore... come faccio a far muovere l'oggetto orizzontalmente ad una velocità fissa?


RE: Teletrasportare un oggetto su unity 3d? - Chip - 14-12-2014

Ma deve sempre andare in orizzontale e da un lato?
Elimina tutta la roba che riguarda horizontal e insisti di un tot sulla x
Per es. così va a destra fisso:
.
.
//il mio vettore pari alle
v2muovi.x=50f;
v2muovi.y=v;
//applica la forza di vettore 2D (v,h)
rigidbody2D.AddForce(v2muovi);
.
.

Altrimenti se vuoi che premendo un tasto vada a dx o sx di velocità fissa penso vada bene il codice che avevi con SPEED e hspeed, questo inverte la velocità dx/sx:

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour {

public Vector2 v2muovi = new Vector2(0f,0f);
public float horizontalSpeed = 0.0f;
public float verticalSpeed = 0.0f;
float h=0f;
// Use this for initialization
//void Start () {
//
//}

// Update is called once per frame
void Update ()
{
//prendo assi e ottengo il (-1..+1) poi moltiplico per la velocità

//float h = horizontalSpeed * Input.GetAxis("Horizontal");
if (Input.GetKeyDown("left"))
{
h = -50f;
}
if (Input.GetKeyDown("right"))
{
h = 50f;
}


float v = verticalSpeed * Input.GetAxis("Vertical");
//azzero la forza altrimenti diventa un missile
rigidbody2D.velocity=Vector2.zero;
//il mio vettore pari alle
v2muovi.x=h;
v2muovi.y=v;
//applica la forza di vettore 2D (v,h)
rigidbody2D.AddForce(v2muovi);
}
}

Chiedo scusa mi sono scordato di fornire l'esempio è che non trovavo più l'account di mediafire Tongue

Poca roba ma se a qualcun'altro agli inizi servisse eccolo QUI


RE: Teletrasportare un oggetto su unity 3d? - zodanilbello - 17-12-2014

Ok però tutte a me succedono???? ho fatto un immagine lunga per il percorso, ma quando lo metto i nunity, quell'immagine si vede malissimo!! che faccio?


RE: Teletrasportare un oggetto su unity 3d? - Chip - 17-12-2014

forse il fattore di scala?


RE: Teletrasportare un oggetto su unity 3d? - zodanilbello - 18-12-2014

in che senso? praticamente si vede tutto a quadretti giganteschi se zoomo la telecamera o ingrandisco l'immagine.. ma fuori da unity si vede benissimo


RE: Teletrasportare un oggetto su unity 3d? - Chip - 18-12-2014

ma che dimensioni ha questa immagine? le impostazioni dello schermo?


RE: Teletrasportare un oggetto su unity 3d? - zodanilbello - 19-12-2014

la dimensione è 6000x2100 ma ho notato che se la spezzo in piu' parti non si rovina l'immagine


RE: Teletrasportare un oggetto su unity 3d? - Chip - 20-12-2014

In effetti credo che sia proprio così che devi fare. Big Grin Dovrebbero essere tante sezioni, specie se l'immagine è tile-zabile
prendi questo come spunto http://pixelnest.io/tutorials/2d-game-unity/background-and-camera/

E' anche questione di memoria.. 6000x2100 pix a 32bit ciascuno una volta espansi sono..mhhh... Sad ahh! 403.200.000bit cioè circa 50.400.000bytes..50MB.

Cercherei di dividerla in 3 righe da 700 e almeno 10 colonne da 600. Una cosa del genere:
AAAAAAAAAA
BBBBBBBBBB
CCCCCCCCCC
Ancora meglio andrebbe considerata la visione dei soli sprite adiacenti a quello dove ti trovi:

Quando sarai più ferrato passerei direttamente ad un tilemap editor ad hoc come:
http://www.mapeditor.org
http://tilestudio.sourceforge.net
http://tide.codeplex.com
e scriptarti un renderer (ce ne dovrebbero essere anche a pagamento nell'asset store).


RE: Teletrasportare un oggetto su unity 3d? - zodanilbello - 04-01-2015

grazie milleee!!!!!