Creare Videogiochi - Game Developer

Versione completa: Problemi di assi su Unity
Al momento stai visualizzando i contenuti in una versione ridotta. Visualizza la versione completa e formattata.
Carissimi, ho un piccolo grande problema. Allora su Unity mi capita spesso che quando metto due oggetti nelle stesse coordinate appaiono in due posizioni diverse(Ovviamente oggetti non imparentati fra loro). Il che è fastidioso, per esempio provando ad usare un gameobject vuoto come spawn di un proiettile sulla bocca della canna di un fucile il proiettile viene istanziato a 10 - 20m traslato in tutti e tre gli assi? Qualcuno mi può aiutare?
Possibile che il proiettile abbia un pivot spostato (e quindi non impostato al centro della mesh)? Oppure è un problema tra posizioni locali (quindi relative al parent) e globali?
io credo sia globale perchè oggetti con stesse coordinate hanno posizioni diverse non penso sia un problema della mesh perchè qualche volta ha funzionato che spawnasse giusto poi niente sempre sbagliato e non so cosa possa creare questo problema
Per istanziare il proiettile usi come coordinate spawner.transform.position (in cui spawner deve essere il GameObject da dove partirà il proiettile, quindi diciamo che potrebbe essere un gameobject vuoto alla fine della canna del fucile) ?
Puoi postare il codice in cui instanzi il proiettile?
Si allora vi mando il codice. Si Davi esattamente


using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class Spar_Caspiterina : MonoBehaviour {
public Rigidbody Bullet;
public Rigidbody Boss , Rel_;
public Transform Boss_spawn;
public Transform Spawn;
private int CurrentCartridge = 8;
private int CurrentAmmo = 32;
private int MaxCartridge = 8;
private Animation Anima;
public string Fire , Rel , End_Fire;
public GameObject Bull;
public bool Ended;
public AudioClip Reload;
public Transform Aim_Pos , Normal_pos;
public float A , B;
public ParticleSystem Fires;
public GameObject Garand;
private Rigidbody BulletInstance;
private Rigidbody BossInstance;
private Rigidbody RelInstance;
void Start ()
{
Fires.Stop ();
}

// Update is called once per frame
void Update ()
{
//Aim ();
Fuoco();
Ricarica ();
}
void Aim()
{
if (Input.GetMouseButton (1)) {
Garand.transform.localPosition = Vector3.Lerp (transform.localPosition, Aim_Pos.position, 0.1f);
Garand.transform.localRotation = Quaternion.Slerp (transform.localRotation, Aim_Pos.rotation, 0.1f);
}
else
{
Garand.transform.localPosition = Vector3.Lerp (transform.localPosition, Normal_pos.position, 0.1f);
Garand.transform.localRotation = Quaternion.Slerp (transform.localRotation, Normal_pos.rotation, 0.1f);
}
}
void Fuoco()
{
if (Input.GetMouseButtonDown (0) && CurrentCartridge > 0 && Garand.GetComponent<Animation>().isPlaying==false)
{PlayerPrefs.SetInt("Fire" , 1);
Fires.Play();
CurrentCartridge --;
BulletInstance = Instantiate(Bullet, Spawn.position, Spawn.rotation) as Rigidbody;
BulletInstance.AddForce(Spawn.forward * 5000);
print(BulletInstance.position.ToString());
BossInstance = Instantiate(Boss, Boss_spawn.position, Boss_spawn.rotation) as Rigidbody;
BossInstance.AddForce(Boss_spawn.forward * 5);
print(BossInstance.position.ToString());
Anima = Garand.GetComponent<Animation>();
Anima.Play(Fire);
StartCoroutine(DSTR());

}

if (Input.GetMouseButtonDown (0) && CurrentCartridge == 0 && Ended == false)
{
PlayerPrefs.SetInt("Fire" , 0);
Ended = true;
Anima = Garand.GetComponent<Animation>();
Anima.Play(End_Fire);
BossInstance = Instantiate(Boss, Boss_spawn.position, Boss_spawn.rotation) as Rigidbody;
BossInstance.AddForce(Boss_spawn.forward * 5);
StartCoroutine(Spwn());
}

}
void Ricarica()
{
if (Input.GetKeyDown(KeyCode.R) && CurrentCartridge == 0 && CurrentAmmo >0)
{
Garand.GetComponent<AudioSource>().clip = Reload;
Garand.GetComponent<AudioSource>().Play();
Anima = Garand.GetComponent<Animation>();
Anima.Play(Rel);
Ended = false;
if(CurrentAmmo < (MaxCartridge - CurrentCartridge))
{
CurrentCartridge = CurrentCartridge + CurrentAmmo;
CurrentAmmo = 0;

}
else

{
CurrentAmmo = (CurrentCartridge - MaxCartridge) + CurrentAmmo;
CurrentCartridge = MaxCartridge;

}

}
}
IEnumerator Spwn()
{
yield return new WaitForSeconds (0.9f);
RelInstance = Instantiate(Rel_, Boss_spawn.position, Boss_spawn.rotation) as Rigidbody;
RelInstance.AddForce(Boss_spawn.forward * 5);
}
void OnGUI()
{
GUI.Label(new Rect(A, B, 200, 190) , CurrentCartridge.ToString() + " | " + CurrentAmmo.ToString());
}
IEnumerator DSTR()
{
yield return new WaitForSeconds(5);
Destroy(BulletInstance);
Destroy(BossInstance);
}
}
Prova con spawn.localrotation comunque per i proiettili e consigliato usare dei raycast invece di instanziare gameobject
Ok grazie mille provo e ti faccio sapere
Senza indentazione la leggibilità muore, così come gli occhi di chi cerca di leggere.
Perché non ci riprovi, magari adoperando l'apposito tag code?

Codice:
int main()
{
  return 0;
}
Ah Ok Scusa :p
Codice:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class Spar_Caspiterina : MonoBehaviour {
public Rigidbody Bullet;
public Rigidbody Boss , Rel_;
public Transform Boss_spawn;
public Transform Spawn;
private int CurrentCartridge = 8;
private int CurrentAmmo = 32;
private int MaxCartridge = 8;
private Animation Anima;
public string Fire , Rel , End_Fire;
public GameObject Bull;
public bool Ended;
public AudioClip Reload;
public Transform Aim_Pos , Normal_pos;
public float A , B;
public ParticleSystem Fires;
public GameObject Garand;
private Rigidbody BulletInstance;
private Rigidbody BossInstance;
private Rigidbody RelInstance;
void Start ()
{
Fires.Stop ();
}

// Update is called once per frame
void Update ()
{    
//Aim ();
Fuoco();
Ricarica ();
}
void Aim()
{
if (Input.GetMouseButton (1)) {
Garand.transform.localPosition = Vector3.Lerp (transform.localPosition, Aim_Pos.position, 0.1f);
Garand.transform.localRotation = Quaternion.Slerp (transform.localRotation, Aim_Pos.rotation, 0.1f);
}
else
{
Garand.transform.localPosition = Vector3.Lerp (transform.localPosition, Normal_pos.position, 0.1f);
Garand.transform.localRotation = Quaternion.Slerp (transform.localRotation, Normal_pos.rotation, 0.1f);
}
}
void Fuoco()
{
if (Input.GetMouseButtonDown (0) && CurrentCartridge > 0 && Garand.GetComponent<Animation>().isPlaying==false)
{PlayerPrefs.SetInt("Fire" , 1);
Fires.Play();
CurrentCartridge --;
BulletInstance = Instantiate(Bullet, Spawn.position, Spawn.rotation) as Rigidbody;
BulletInstance.AddForce(Spawn.forward * 5000);
print(BulletInstance.position.ToString());
BossInstance = Instantiate(Boss, Boss_spawn.position, Boss_spawn.rotation) as Rigidbody;
BossInstance.AddForce(Boss_spawn.forward * 5);
print(BossInstance.position.ToString());
Anima = Garand.GetComponent<Animation>();
Anima.Play(Fire);
StartCoroutine(DSTR());

}

if (Input.GetMouseButtonDown (0) && CurrentCartridge == 0 && Ended == false)
{
PlayerPrefs.SetInt("Fire" , 0);
Ended = true;
Anima = Garand.GetComponent<Animation>();
Anima.Play(End_Fire);
BossInstance = Instantiate(Boss, Boss_spawn.position, Boss_spawn.rotation) as Rigidbody;
BossInstance.AddForce(Boss_spawn.forward * 5);
StartCoroutine(Spwn());
}

}
void Ricarica()
{
if (Input.GetKeyDown(KeyCode.R) && CurrentCartridge == 0 && CurrentAmmo >0)
{
Garand.GetComponent<AudioSource>().clip = Reload;
Garand.GetComponent<AudioSource>().Play();
Anima = Garand.GetComponent<Animation>();
Anima.Play(Rel);
Ended = false;
if(CurrentAmmo < (MaxCartridge - CurrentCartridge))
{
CurrentCartridge = CurrentCartridge + CurrentAmmo;
CurrentAmmo = 0;

}
else

{
CurrentAmmo = (CurrentCartridge - MaxCartridge) + CurrentAmmo;
CurrentCartridge = MaxCartridge;

}

}
}
IEnumerator Spwn()
{
yield return new WaitForSeconds (0.9f);
RelInstance = Instantiate(Rel_, Boss_spawn.position, Boss_spawn.rotation) as Rigidbody;
RelInstance.AddForce(Boss_spawn.forward * 5);
}
void OnGUI()
{
GUI.Label(new Rect(A, B, 200, 190) , CurrentCartridge.ToString() + " | " + CurrentAmmo.ToString());
}
IEnumerator DSTR()
{
yield return new WaitForSeconds(5);
Destroy(BulletInstance);
Destroy(BossInstance);
}
}