void Fire() //atirar
    {
        //Dispersao da bala (definir)
        Quaternion dispersao = DefineSpread();

        audioSource.PlayOneShot(shootSound); //tocar som de atirar

        //criar bullet
        GameObject bullet = Instantiate(bulletPrefab, bulletSpawn.position, bulletSpawn.rotation * dispersao);

        bullet.layer = LayerMask.NameToLayer("PlayerBullet");        //informar layer da bala

        BulletHealth bulletH = bullet.GetComponent <BulletHealth>(); //pegar script de vida da bala

        if (bulletH != null)                                         //se conseguiu
        {
            bulletH.source       = "Character";                      //informar fonte da bala
            bulletH.bulletDamage = bulletDamage;                     //informar dano da bala
        }

        //velocidade da bala (enviar funcao)
        bullet.gameObject.SendMessageUpwards("SetVelocity", bulletSpeed, SendMessageOptions.DontRequireReceiver); //enviar velocidade, nao requisitar erro caso nao encontre

        //destruir bullet apos x segundos
        Destroy(bullet, bulletLifeTime); //tempo de vida da bullet
    }
コード例 #2
0
    void Fire()      //atirar
    {
        if (bulletX) //mudar tipo de bala: raio//bala (para teste)
        {
            //criar bullet
            GameObject bullet = Instantiate(laserPrefab, bulletSpawn.position, bulletSpawn.rotation);

            bullet.layer = LayerMask.NameToLayer("PlayerBullet");        //informar layer da bala

            BulletHealth bulletH = bullet.GetComponent <BulletHealth>(); //pegar script de vida da bala
            if (bulletH != null)                                         //se conseguiu
            {
                bulletH.source       = "Character";                      //informar fonte da bala
                bulletH.bulletDamage = bulletDamage;                     //informar dano da bala
            }

            //bullet.GetComponent<LaserController2>().bulletSpawnTransform = gameObject.transform.GetChild(0); //pega o transform do primeiro filho (bullet spawn)
            bullet.gameObject.SendMessageUpwards("SetBulletSpawnTransform", gameObject.transform.GetChild(0), SendMessageOptions.DontRequireReceiver); //enviar transform, nao requisitar erro caso nao encontre

            //destruir bullet apos x segundos
            Destroy(bullet, bulletLifeTime); //tempo de vida da bullet
        }
        else
        {
            //criar bullet
            GameObject bullet = Instantiate(bulletPrefab, bulletSpawn.position, bulletSpawn.rotation);

            bullet.layer = LayerMask.NameToLayer("PlayerBullet");             //informar layer da bala

            bullet.GetComponent <BulletHealth>().source       = "Character";  //informar fonte da bala
            bullet.GetComponent <BulletHealth>().bulletDamage = bulletDamage; //informar dano da bala

            //velocidade da bala (enviar funcao)
            bullet.gameObject.SendMessageUpwards("SetVelocity", bulletSpeed, SendMessageOptions.DontRequireReceiver); //enviar velocidade, nao requisitar erro caso nao encontre

            //destruir bullet apos x segundos
            Destroy(bullet, bulletLifeTime); //tempo de vida da bullet
        }
    }
コード例 #3
0
    public Vector3 DoLaser()
    {
        BulletHealth bulletH = gameObject.GetComponent <BulletHealth>();

        if (bulletH != null && bulletH.GetCollisionMask() != 0) //verificar se ja existe, e se nao eh nulo
        {
            collisionMask = bulletH.GetCollisionMask();         //setar mascara de colisao (pra dependendo de quem segura a arma, etc)
        }

        Vector3 pontoFinalLaser = bulletSpawnTransform.position + bulletSpawnTransform.right * maxDistLaser; //pra frente vermelho ate distancia maxima

        RaycastHit2D pontoColisao;                                                                           //ponto de colisao do laser antes da distancia maxima

        Ray2D ray = new Ray2D(bulletSpawnTransform.position, bulletSpawnTransform.right);                    //criar raio da posicao na direcao da seta vermelha (do mundo)

        //Physics2D.queriesStartInColliders = false;

        //int collisionMask = 1 << LayerMask.NameToLayer("PlayerBullet") | 1 << LayerMask.NameToLayer("Character"); //pegar layer corrente (bit shift + bit or)
        //collisionMask = ~collisionMask; //todas menos as selecionadas (inverter)

        pontoColisao = Physics2D.Raycast(ray.origin, bulletSpawnTransform.right, maxDistLaser, collisionMask);//, LayerMask.NameToLayer("PlayerBullet")); //com ponto de colisao e distancia e ignorar layer 9 do character
        //new ContactFilter2D();

        Vector3 startPos = bulletSpawnTransform.position;// + bulletSpawnTransform.right;
        //Vector3 centerPos = new Vector3(startPos.x + pontoFinalLaser.x, startPos.y + pontoFinalLaser.y) / 2;
        float   scaleX = Mathf.Abs(startPos.x - pontoFinalLaser.x);
        float   scaleY = Mathf.Abs(startPos.y - pontoFinalLaser.y);
        Vector2 scale  = new Vector2(scaleX, scaleY);

        //Debug.Log(pontoColisao.collider + " bla " + LayerMask.NameToLayer("PlayerBullet"));
        if (pontoColisao.collider) //verificar hit com algo
        {
            //lineRenderer.SetPosition(0, transform.position); //linha entre origem e request da colisao/ponto onde aconteceu a colisao
            //lineRenderer.SetPosition(1, pontoColisao.point); //ponto onde o raio colidiu

            lightCollider.transform.position = pontoColisao.point;// - (Vector2)posLuz; //alterar fim do laser

            //centerPos = new Vector3(startPos.x + pontoColisao.point.x, startPos.y + pontoColisao.point.y) / 2;

            scaleX = Mathf.Abs(startPos.x - pontoColisao.point.x);
            scaleY = Mathf.Abs(startPos.y - pontoColisao.point.y);
            scale  = new Vector2(scaleX, scaleY);
            //scale = pontoColisao.point;

            //Debug.Log(pontoColisao.point);
            //Debug.Log(startPos + "  " + scale.magnitude);

            //pra arrumar o "delay" de chegar o laser --> parar objeto momentaneamente
            if (pontoColisao.transform.gameObject.CompareTag("Enemy"))                                                                                                //torna meio impossivel um freeze laser (a nao ser que altere o stopTime)
            {
                pontoColisao.transform.gameObject.SendMessageUpwards("ChangeSpeedTemporarily", new float[] { stopTime, 0f }, SendMessageOptions.DontRequireReceiver); //enviar "freeze", nao requisitar erro caso nao encontre
            }

            //criar bala no ponto final do laser
            //GameObject bullet = Instantiate(bulletPrefab, pontoColisao.point, bulletSpawnTransform.rotation); //para teste
            //Debug.Log(bullet.transform.localPosition); //criar um "laserEnd" para arrumar a colisao final
            //Debug.Log("sizeBullet: " + bullet.gameObject.GetComponent<SpriteRenderer>().sprite.bounds.size.x); //para teste
            //Destroy(bullet, 4f);
        }
        else //se nao ocorreu colisao
        {
            //lineRenderer.SetPosition(0, transform.position); //linha entre origem e ponto final do laser
            //lineRenderer.SetPosition(1, pontoFinalLaser);

            lightCollider.transform.position = pontoFinalLaser; //alterar fim do laser
        }

        //centerPos.x -= 0.5f;
        //centerPos.y += 0.5f;

        //lightCollider.transform.position = pontoFinalLaser;
        //Strech(gameObject, transform.position, pontoFinalLaser, false);

        //gameObject.transform.position = centerPos;
        gameObject.transform.position = bulletSpawnTransform.position;
        //gameObject.transform.localScale = new Vector3(scaleX, scaleY, 1); //*2

        Bounds b     = gameObject.GetComponent <SpriteRenderer>().sprite.bounds; //isso deu trabalho pra encontrar '-'-' .-.-.
        float  xSize = b.size.x;

        //Debug.Log(gameObject.GetComponent<SpriteRenderer>().sprite.bounds);

        gameObject.transform.rotation = Quaternion.Euler(new Vector3(0f, 0f, 90f)); //nao tao necessario agr, mas normaliza rotacao aumenta dps rotaciona
        //gameObject.transform.localScale = new Vector3(scale.magnitude / xSize, larguraFinal, 1); //*2 //encontrar proporcao certa '-'
        //gameObject.transform.localScale = Vector3.Lerp(transform.localScale, new Vector3(scale.magnitude / xSize, larguraFinal, 1), speedResize * Time.deltaTime); //*2 //encontrar proporcao certa '-'
        gameObject.transform.rotation = bulletSpawnTransform.rotation;

        return(new Vector3((scale.magnitude + differenceAdjust) / xSize, larguraFinal, 1)); //scale.magnitude = tamanho do desenho do traço do laser
    }