Messaggi: 244
Discussioni: 41
Thanks Received:
0 in 0 posts
Thanks Given: 0
Thanks Received:
0 in 0 posts
Thanks Given: 0
Registrato: Jun 2013
Reputazione:
1
15-06-2015, 03:11 PM
(Questo messaggio è stato modificato l'ultima volta il: 15-06-2015, 07:08 PM da samuele55598@gmail.com.)
Salve ho questo script:
if (Input.GetButtonDown("Fire1")) {
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray)){
Instantiate(particle, transform.position, transform.rotation);
}
}
ma mi da questo errore:
NullReferenceException: Object reference not set to an instance of an object
Movement.Update () (at Assets/My Assets/Scripts/Movement.cs:40)
sulla riga della variabile ray => Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
dov'è il problema, io al massimo me lo sarei aspettato dall'istruzione instantiate ma non da questa, tra l'altro non capisco il senso dell'errore, insomma quella riga dovrebbe creare un raycast dalla main camera alle coordinate in pixel del mouse sullo schermo, forse l'errore è che dovrebbe essere di classe raycast e non ray, giusto? Beh devo riuscire a far spawnare un particle system che ho come prefab quando clicco il mouse dove punta il raycast che va dalla main camera al cursore, se non sono stato chiaro nell'esporre il problema fatemelo sapere, grazie per l'attenzione
Messaggi: 183
Discussioni: 10
Thanks Received:
0 in 0 posts
Thanks Given: 0
Thanks Received:
0 in 0 posts
Thanks Given: 0
Registrato: Apr 2013
Reputazione:
0
Posta tutto il codice che ti dico il problema
Messaggi: 244
Discussioni: 41
Thanks Received:
0 in 0 posts
Thanks Given: 0
Thanks Received:
0 in 0 posts
Thanks Given: 0
Registrato: Jun 2013
Reputazione:
1
Ecco l'intero script:
using UnityEngine;
using System.Collections;
public class Movement : MonoBehaviour {
public float moveSpeed;
public GameObject particle;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetKey(KeyCode.W))
{
transform.Translate(Vector3.forward * Time.deltaTime*moveSpeed);
Ray ras = new Ray(transform.position,Vector3.forward);
Debug.DrawRay(ras.origin, ras.direction * 10, Color.yellow);
}
if (Input.GetKey(KeyCode.S))
{
transform.Translate(-Vector3.forward * Time.deltaTime*moveSpeed);
}
if (Input.GetKey(KeyCode.A))
{
transform.Translate(-Vector3.right * Time.deltaTime*moveSpeed);
}
if (Input.GetKey(KeyCode.D))
{
transform.Translate(Vector3.right * Time.deltaTime*moveSpeed);
}
if (Input.GetButtonDown("Fire1")) {
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray)){
Instantiate(particle, transform.position, transform.rotation);
}
}
}
}
Messaggi: 183
Discussioni: 10
Thanks Received:
0 in 0 posts
Thanks Given: 0
Thanks Received:
0 in 0 posts
Thanks Given: 0
Registrato: Apr 2013
Reputazione:
0
1)hai selezionato il particle nel inspector?
2)non capisco a cosa ti serva il raycast visto che non rilevi se collide con un oggetto
3)prova con:
Instatiate (tuoOggetto,laPosizione,laRotazione)as Gameobject;
Messaggi: 244
Discussioni: 41
Thanks Received:
0 in 0 posts
Thanks Given: 0
Thanks Received:
0 in 0 posts
Thanks Given: 0
Registrato: Jun 2013
Reputazione:
1
Voglio che venga istanziato dove clicco con il mouse, ma per far capire anche a unity dove deve spawnare gli devo dare la 3à dimensione della posizione di dove voglio che spawni quindi ci vuole un raycast che prenda come x e y le coordinate del mouse sullo schermo e che venga puntato dove clicca il mouse da qui la 3à dimensione, e si ho selezionato il particle
Messaggi: 183
Discussioni: 10
Thanks Received:
0 in 0 posts
Thanks Given: 0
Thanks Received:
0 in 0 posts
Thanks Given: 0
Registrato: Apr 2013
Reputazione:
0
Instantiate(particle, transform.position, transform.rotation);
queste posizioni non sono le posizioni dove clicchi con il mouse ma son le posizioni e rotazione del gameobject a cui hai attaccato lo script
Messaggi: 244
Discussioni: 41
Thanks Received:
0 in 0 posts
Thanks Given: 0
Thanks Received:
0 in 0 posts
Thanks Given: 0
Registrato: Jun 2013
Reputazione:
1
veramente dovrebbe spawnarlo come prefab non come gameobject ovvero io alla variabile del game object da spawnare ho dato in pasto un prefab di un particle system, se ci metto transform.position , rotation visto che questo script è attaccato al player , il particle system si spawnerebbe "dentro" il player
Messaggi: 629
Discussioni: 79
Thanks Received:
1 in 1 posts
Thanks Given: 0
Thanks Received:
1 in 1 posts
Thanks Given: 0
Registrato: Nov 2013
Reputazione:
6
Allora prova con Instantiate(nome prefab, Input.mousePosition, Quaternion.Identity);
Messaggi: 244
Discussioni: 41
Thanks Received:
0 in 0 posts
Thanks Given: 0
Thanks Received:
0 in 0 posts
Thanks Given: 0
Registrato: Jun 2013
Reputazione:
1
16-06-2015, 10:57 PM
(Questo messaggio è stato modificato l'ultima volta il: 16-06-2015, 11:17 PM da samuele55598@gmail.com.)
Si ma comunque l'errore non è li, ma ci provo
Mi da errore su Quaternion, comunque ho provato con:
if (Input.GetButtonDown("Fire1")) {
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Instantiate(particle, transform.position, transform.rotation);
}
e funziona, il particle system si spawna dove sta il player, e va bene ora se io volessi che si spawnasse dove viene cliccato il mouse, (come rotazione per ora ci lascio quella del player) come posso trasformare un raycast in un Vector3 per poterlo inserire in questo metodo
Messaggi: 183
Discussioni: 10
Thanks Received:
0 in 0 posts
Thanks Given: 0
Thanks Received:
0 in 0 posts
Thanks Given: 0
Registrato: Apr 2013
Reputazione:
0
16-06-2015, 11:27 PM
(Questo messaggio è stato modificato l'ultima volta il: 16-06-2015, 11:30 PM da WilSoft90.)
Un prefab e sempre un gameobject...togli quel raycast che non ti serve a niente usato cosi(non lo stai utillizzando) nel if del tasto fire metti direttamente l Instatiate ()as Gameobject;
Allora ti ripeto che un raycast non ti serve a meno che non fuoi creare il particle quando colpisci un oggetto...se vuoi che avvenga questo basta aggiungere un raycast hit; e con hit.collider puoi usarlo per conoscere il punto in cui tocca il ray
Messaggi: 244
Discussioni: 41
Thanks Received:
0 in 0 posts
Thanks Given: 0
Thanks Received:
0 in 0 posts
Thanks Given: 0
Registrato: Jun 2013
Reputazione:
1
E se io volessi istanziare il particle system dove clicco con il mouse, come posso fare?
Messaggi: 629
Discussioni: 79
Thanks Received:
1 in 1 posts
Thanks Given: 0
Thanks Received:
1 in 1 posts
Thanks Given: 0
Registrato: Nov 2013
Reputazione:
6
Quaternion.identity prova a scriverlo così
Messaggi: 183
Discussioni: 10
Thanks Received:
0 in 0 posts
Thanks Given: 0
Thanks Received:
0 in 0 posts
Thanks Given: 0
Registrato: Apr 2013
Reputazione:
0
17-06-2015, 12:06 AM
(Questo messaggio è stato modificato l'ultima volta il: 17-06-2015, 02:59 AM da WilSoft90.)
Raycasthit hit;
If (physics.raycast (ray,out hit ){
Instantiate (particle,hit.point,laRotaziineCheVuoi)as Gameobject;
}
questo ti instanzia il particle nel punto in cui colpisce il ray che nel tuo caso hai usato il mouse
non ricordo se e hit.point oppure hit.collider.point
EDIT
ma dimmi una cosa ti serve per caso per simulare la fiammata di un arma?se si ti conviene creare on oggetto vuoto lo rendi figlio del arma e lo posizioni alla fine della canna e poi con il tasto fire spawni il particle nella posizione di quel oggetto vuoto
Messaggi: 244
Discussioni: 41
Thanks Received:
0 in 0 posts
Thanks Given: 0
Thanks Received:
0 in 0 posts
Thanks Given: 0
Registrato: Jun 2013
Reputazione:
1
No no semplicemente voglio, un pò come fa minecraft di poter spawnare oggeti a mio piacimento nella scena dove clicco con il mouse, con l'unica differenza che minecraft spawna a quadrati mentre qui spawni davvero dove vuoi ecco tutto
Messaggi: 629
Discussioni: 79
Thanks Received:
1 in 1 posts
Thanks Given: 0
Thanks Received:
1 in 1 posts
Thanks Given: 0
Registrato: Nov 2013
Reputazione:
6
Ahhh allora ho capito bhè allora devi fare con i raycast, posizione un oggetto vuoto che sarà l'oggetto da cui partirà il raggio e dopo scrivi nel codice
Transform raySpawn; //Questo è l'oggetto vuoto che hai creato prima
void Update()
{
if(Input.GetKeyDown(KeyCode.Mouse0))
{
RaycastHit hit;
if(Physics.Raycast(raySpawn.position, raySpawn.forward, out hit))
{
GameObject go = Instantiate(nome variabile del prefab, hit.point, Quaternion.FromToRotation(Vector3.up, hit.normal)) as GameObject;
}
}
}
Messaggi: 183
Discussioni: 10
Thanks Received:
0 in 0 posts
Thanks Given: 0
Thanks Received:
0 in 0 posts
Thanks Given: 0
Registrato: Apr 2013
Reputazione:
0
Comunque l errore era nel instantiate cioe non era associato ad un gameobject quando instanzi un oggetto devi fare (come scritto sopra da black)
Gameobject oggetto = instantiate (blablabla)as Gameobject;
Messaggi: 629
Discussioni: 79
Thanks Received:
1 in 1 posts
Thanks Given: 0
Thanks Received:
1 in 1 posts
Thanks Given: 0
Registrato: Nov 2013
Reputazione:
6
Infatti non c'è tanto altro da capire, il Vector3 contiene 3 variabili float : X, Y, Z che riguardano la maggior parte dei casi la posizione, infatti il transform.position è un Vector3, mentre il Quaternion : X, Y, Z, W riguarda la rotazione quindi transform.rotation