Page 1 sur 1

[RESOLU][DB-AL] Unity 2D-Viseur arme semi-fonctionnel

Publié : 27 Août 2018 23:13
par damien-max
Bonjour,

Je suis entrain de porter mon jeu sur android, et je souhaite que lorsque l'on touche l'écran, l'arme pointe l'endroit et tire. Ceci est chose faite.

Le problème, c'est que cela s'applique à tous l'écran, et j'aimerais faire une "zone morte", c'est à dire que lorsque l'on souhaite déplacer le personnage et que l'on bouge le joystick, l'arme ne se mette pas à tirer dans la direction du joystick. Voici à quoi ressemble l'interface (elle est encore en développement): https://drive.google.com/open?id=1jJ9IR ... EHxKLBgwYj

En gros, la zone rouge est ce que j'appelle la "zone morte". La zone verte et celle où l'on peut appuier pour tirer.

Voici également le script du curseur:

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class MousePositionCursor : MonoBehaviour{

    Vector3 posMouse;
	public bool useController;
	public static Weapon weapon;
    // Use this for initialization
    void Awake()
    {

    }

    // Update is called once per frame
    void Update()
    {
		if (!useController)
	        posMouse = Camera.main.ScreenToWorldPoint(Input.mousePosition);
	        posMouse.z = 0;
	        gameObject.transform.position = posMouse;
    

	if (useController) {
		Vector2 playerDirection = Vector3.right * Input.GetAxisRaw ("RHorizontal");
	if (playerDirection.sqrMagnitude > 0.0f) {
			transform.rotation = Quaternion.LookRotation(playerDirection, Vector3.up);
		}
			if (Input.GetKeyDown (KeyCode.Joystick1Button10))
				weapon.Shoot ();
	}
}
}
Encore merci à vous pour votre aide et votre soutient :)

Re: [DB-AL] Unity 2D-Viseur arme semi-fonctionnel

Publié : 28 Août 2018 09:02
par boubouk50
Salut,
il existe le booléen EventSystem.IsPointerOverGameObject qui te permet de savoir si tu cliques sur un élément d'UI.
Egalement, tu pourrais tester au niveau du touch, sur quel élément tu cliques et ne pas tirer. Définir les éléments où tu ne tires pas par un tag qui servirait de condition, par exemple.

Re: [DB-AL] Unity 2D-Viseur arme semi-fonctionnel

Publié : 28 Août 2018 12:35
par damien-max
boubouk50 a écrit :
28 Août 2018 09:02
Salut,
il existe le booléen EventSystem.IsPointerOverGameObject qui te permet de savoir si tu cliques sur un élément d'UI.
Egalement, tu pourrais tester au niveau du touch, sur quel élément tu cliques et ne pas tirer. Définir les éléments où tu ne tires pas par un tag qui servirait de condition, par exemple.
D'accord, je test cela et je vous tient au courant. Merci !

Re: [DB-AL] Unity 2D-Viseur arme semi-fonctionnel

Publié : 29 Août 2018 18:41
par damien-max
J'ai refait le systeme de tir, et c'est maintenant l'arme qui sert de repaire de tir. J'ai changé les valeurs de souris sur touch, et mis un systeme en fonction de la position par rapport à l'écran. L'arme ne tire plus, et je peux manier les controles. Tout marche superbement! voici le code que j'ai utilisé:

Code : Tout sélectionner

using System.Collections;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Experimental.UIElements;

public class Weapon : MonoBehaviour {

	public float FireRate = 0;
	public float Damage = 10;
	public LayerMask whatToHit;

	public Transform BulletTrailPrefab;
	public Transform MuzzleFlashPrefab;
	float timeToSpawnEffet = 0;
	public float effectSpawnRate = 10;
	public float screenHeight;

	float timeToFire = 0;
	Transform firePoint;

	// Use this for initialization
	void Awake () {
		firePoint = transform.Find ("FirePoint");
		if (firePoint == null) {
			Debug.LogError ("Pas de firepoint? WHAT?!");

		}
	}

	AudioSource audio;

	void Start () {
		audio = GetComponent<AudioSource>();
		screenHeight = Screen.height;
	}
	// Update is called once per frame
	void Update () {

		if (Input.touchCount >0) {

			if (Input.GetTouch (0).position.y < screenHeight / 2) {
			Debug.Log ("Pas de tir");
		}
	
		else {
			if (FireRate == 0) {
				if (Input.GetTouch (0).position.y > screenHeight / 2) {
					Shoot ();
				}
			}
		
			else{
				if (Input.GetTouch (0).position.y > screenHeight / 2 && Time.time > timeToFire)  {
				timeToFire = Time.time + 1/FireRate;
				Shoot();
				audio.Play ();
			}
		}
	}
}
}

	public void Shoot () {

		Vector2 mousePosition = new Vector2 (Camera.main.ScreenToWorldPoint (Input.mousePosition).x, Camera.main.ScreenToWorldPoint(Input.mousePosition).y) ;
		Vector2 firePointPosition = new Vector2 (firePoint.position.x, firePoint.position.y);
		RaycastHit2D hit = Physics2D.Raycast (firePointPosition, mousePosition - firePointPosition, 100, whatToHit);
		if (Time.time >= timeToSpawnEffet) {
			Effect ();
			timeToSpawnEffet = Time.time + 1 / effectSpawnRate;
		}
		Debug.DrawLine (firePointPosition, (mousePosition-firePointPosition)*100, Color.black);
		if (hit.collider != null) {
			Debug.DrawLine (firePointPosition, hit.point, Color.red);
			//Debug.Log ("Tu a touché " + hit.collider.name + " et inffligé " + Damage + " dégats!");
		}
	}

	void Effect () {
		Instantiate (BulletTrailPrefab, firePoint.position, firePoint.rotation);
		Transform clone = Instantiate (MuzzleFlashPrefab, firePoint.position, firePoint.rotation) as Transform;
		clone.parent = firePoint;
		float size = Random.Range (3f, 3.9f);
		clone.localScale = new Vector3 (size, size, size);
		Destroy (clone.gameObject, 0.02f);
	}
}
Merci de votre aide! :)

Re: [DB-AL] Unity 2D-Viseur arme semi-fonctionnel

Publié : 29 Août 2018 19:06
par Max
Du coup si tu es arrivé à tes fins, n'hésite pas à passer le sujet en RESOLU (édition du titre du message initial).
Merci.