Skip to content
Home » 유니티 2D 총알 발사 | [유니티2D] 총알을 쏴보자! 뿌슝! 20276 투표 이 답변

유니티 2D 총알 발사 | [유니티2D] 총알을 쏴보자! 뿌슝! 20276 투표 이 답변

당신은 주제를 찾고 있습니까 “유니티 2d 총알 발사 – [유니티2D] 총알을 쏴보자! 뿌슝!“? 다음 카테고리의 웹사이트 sk.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: sk.taphoamini.com/wiki. 바로 아래에서 답을 찾을 수 있습니다. 작성자 Dev GomDol 이(가) 작성한 기사에는 조회수 14,176회 및 좋아요 179개 개의 좋아요가 있습니다.

Table of Contents

유니티 2d 총알 발사 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 [유니티2D] 총알을 쏴보자! 뿌슝! – 유니티 2d 총알 발사 주제에 대한 세부정보를 참조하세요

#유니티 2D에서 raycast를 사용한 원거리 공격 방법을 알려드립니다.
스크립트 언어는 C# 입니다.
기초적인 부분으로 참고하시길 바랍니다.
잘못된 점이나 조언, 충고는 언제나 환영입니다.
이미지 : https://www.kenney.nl/assets

유니티 2d 총알 발사 주제에 대한 자세한 내용은 여기를 참조하세요.

2D 총알구현,발사 – 붉은범의개발일기

주로 백준문제풀이와 유니티개발일기 작성하고있습니다~! … 나는 이번 프로젝트에서 총알 발사 버튼을 A로 해줄꺼여서 아래처럼 설정했으므로 자기 …

+ 여기를 클릭

Source: red-tiger.tistory.com

Date Published: 4/16/2022

View: 1583

2D 슈팅 게임 만들기 (5) 총알 발사하기 및 폭발 – 네이버 블로그

이제 발사를 해볼 것이다. 스크립트 하나를 추가하여 작성해보도록 하자. moveSpeed는 총알이 날아가는 속도이다. X축으로 날아가냐 Y축으로 날아가 …

+ 여기에 보기

Source: m.blog.naver.com

Date Published: 9/20/2022

View: 366

2D 액션 게임 만들기 3 weapon (총) 회전시켜서 총알 발사하기 …

게임 만들기 강좌/유니티2D액션게임만들기. 2D 액션 게임 만들기 3 weapon (총) 회전시켜서 총알 발사하기 …

+ 여기에 더 보기

Source: magatron.tistory.com

Date Published: 5/14/2022

View: 9703

Unity – 플레이어 총알 발사 구현하기! – YunDev

Unity – 플레이어 총알 발사 구현하기! S준 2020. 4. 1. 08:30. 안녕하세요!! 오늘은 슈팅게임에서 플레이어가 총알을 발사하는 코드에 대해서 알아보려고 합니다.

+ 여기에 표시

Source: sj0716.tistory.com

Date Published: 9/2/2022

View: 6467

Unity – 총알 구현하기(Bullet) – 말봉코드

구현방법 생각하기. 1) 총알 만들기(Bullet). 이동, 충돌 처리, 이펙트 재생. 2) 총알 나오는 곳(Bullet Shooter). 회전, 총알생성 …

+ 여기를 클릭

Source: malbongcode.tistory.com

Date Published: 5/17/2022

View: 873

유니티-8방향으로 총알을 발사하다.

위 코드에서 중요한점은 바로. rbody.AddForce 함수이다. 하기 라인을 해석하자면, X축으로 10의 힘을, Y축으로 10의 힘을 주어서 발사하라는 의미로 …

+ 여기를 클릭

Source: soo0100.tistory.com

Date Published: 2/6/2022

View: 8317

7일차 – 레이저 발사하기 · 유니티로 2D 슈팅게임 만들기

우선 아까 만든 레이저 프리펩을 이용하여 레이저가 발사 되도록 구현할건데요, Player.cs 안에 다음과 같은 멤버 변수를 추가해 줍시다. public GameObject laserPrefab; …

+ 여기에 자세히 보기

Source: astoration.gitbooks.io

Date Published: 6/14/2022

View: 9232

유니티13_게임 제작 과정_03_미사일 발사 – 취하게코

총알 만들기. 무기는 게임 도중에 공격할 때 마다 만들어져야 한다. 이렇듯 게임 실행 도중에 스크립트로 게임오브젝트를 만드는 작업을 ‘런타임 생성 …

+ 더 읽기

Source: fiftiesstudy.tistory.com

Date Published: 8/8/2021

View: 1696

주제와 관련된 이미지 유니티 2d 총알 발사

주제와 관련된 더 많은 사진을 참조하십시오 [유니티2D] 총알을 쏴보자! 뿌슝!. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

[유니티2D] 총알을 쏴보자! 뿌슝!
[유니티2D] 총알을 쏴보자! 뿌슝!

주제에 대한 기사 평가 유니티 2d 총알 발사

  • Author: Dev GomDol
  • Views: 조회수 14,176회
  • Likes: 좋아요 179개
  • Date Published: 2019. 4. 13.
  • Video Url link: https://www.youtube.com/watch?v=ggr_kKwr1OY

2D 총알구현,발사

반응형

반응형

이번 포스팅에서는 총알을 구현하고 발사하는거 까지 해보겠다.

일단 본격적으로 스크립트를 수정하기에 앞서서 Edit->ProjectSettings->Input Manager에 들어가서 아래사진과 같이 Fire1버튼을 A로 설정해주자. 나는 이번 프로젝트에서 총알 발사 버튼을 A로 해줄꺼여서 아래처럼 설정했으므로 자기가 편한대로 해도 무방하다.

이제 스크립트를 설명하겠다 스크립트를 설명하기에 앞서서, 이전 포스팅과 스크립타가 많이 달라졌다.

위에 사진을 보면 알겠지만 부모오브젝트를 Helmet으로 두고 자식오브젝트에 weapons를 넣었다.

그래서 Player.cs 에서 Weapone.cs 스크립트를 불러서 왼쪽방향키를 누를땐 캐릭터를 기준으로 왼쪽에 위치하고 왼쪽으로 총구를향하게 했다. 바뀐 코드는 아래와 같다. 자세한 설명은 아래를 보며 이해하도록 하자.

Player.cs

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { private Weapon w;//스크립트 public GameObject Weapons_0;//무기 오브젝트 SpriteRenderer rend; Rigidbody2D rigid; public float maxShotDelay;//최대속도 public float curShotDelay;//발사간 속도 public GameObject bulletObj; // Start is called before the first frame update void Start() { w = Weapons_0.GetComponent();//스크립트 불러옴 rigid = gameObject.GetComponent(); rend = GetComponent(); } // Update is called once per fdbslxl rame , 1분에 약60번 업데이트 void Update() { Move();//이동하는 함수 Fire();//총알을 쏘는 함수 Reload();//장전한하는 함수 } void Move() { rigid.velocity = new Vector2(0, 0); if (Input.GetKey(KeyCode.LeftArrow))//왼쪽 방향키 누르면 { w.yFlip(); rend.flipX = true; Weapons_0.transform.localPosition = new Vector3(-0.66f, 0.38f, 0); rigid.velocity = new Vector2(-10f, 0); } if (Input.GetKey(KeyCode.RightArrow))//오른쪽 방향키 누르면 { w.nFlip(); Weapons_0.transform.localPosition = new Vector3(0.66f, 0.38f, 0); rend.flipX = false; rigid.velocity = new Vector2(10f, 0); } if (Input.GetKey(KeyCode.UpArrow)) { rigid.AddForce(new Vector2(0, 50f)); } } void Reload() { curShotDelay += Time.deltaTime; } void Fire()//발사하는 함수 { if(!Input.GetButton(“Fire1”))//Fire버튼을 안누르면 종료 { return; } if(curShotDelay(); rigid.AddForce(Vector2.right*10,ForceMode2D.Impulse); curShotDelay = 0;//꼭 초기화해줘야된다. } }

Weapon.cs

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Weapon : MonoBehaviour { SpriteRenderer rend; private void Start() { rend = GetComponent(); } public void yFlip() { rend.flipX = true; } public void nFlip() { rend.flipX = false; } }

이번 포스팅에서 제일 중요하게 여길 개념은 바로 프리펩이다.

프리펩이란? 재활용을 위해 에셋으로 저장된 게임 오브젝트

즉 총알은 프리펩으로 구현을 해줘야 한다. 아래 사진과 같이 프리펩폴더에 총알을 넣어준다.

만약 Player.cs를 위와 같이 구현했다면 아래 사진에 동그라미 친 곳과 같이 BulletObj를 선택할 수 있는데 거기에 만들어논 Bullet프리펩을 넣어준다.

아래는 시현 영상이다.

의도한대로 총알이 제한속도에 맞춰서 나가기는 한다. 그런데 아래에서 생성이된다….. 그리고 또한 총알을 계속 쓰다보면 무한히 생성되서 과부하가 걸리는데 일정영역을 벗어나면 파괴데게 bullet.cs 스크립트를 새로 작성해줘야 할 필요성이 느껴진다.

다음 포스팅에서는

총알 발사 똑바로 되게 수정

일정영역을 벗어나면 총알이 없어지게(파괴되게) 수정

위 2가지를 포스팅해 볼까 한다.

댓글과 지적은 언제든지 환영입니다~!

글이 마음에 들었다면 왼쪽이미지를 눌러서 후원 부탁드립니다>< 반응형

2D 슈팅 게임 만들기 (5) 총알 발사하기 및 폭발

총알은 Space키를 눌러서 발사할 것인데, 만약 Space키를 눌렀을 때에 총알이 무한대로 엄청난 속도록 날아간다면 벨런스상 문제가 있을 수 있기 때문에 이에 딜레이를 살짝 주도록 한다.

다르게 한다면 오락실에서 하던 게임으로 보자면 키를 눌렀을 때 한번만 나가게 한다면 연속으로 눌러서 누르는 속도만큼 발사가 되게도 가능할 것이다.

이제 플레이어가 총알을 보유할 수 있도록 Player 스크립트에 firePrefab을 추가해주도록 한다. 폭발할 때와 같다고 보면 되겠다. 여기서 추가로 좀전에 말한 총알의 딜레이를 주기위해서 bool을 사용해 사용가능한 상태인지 아닌지를 체크해줄 것이고, 딜레이시간을 만들어주도록 한다.

마지막으로 시간을 젤 타이머도 추가해주자.

2D 액션 게임 만들기 3 weapon (총) 회전시켜서 총알 발사하기 (Shooting)

728×90

반응형

Gun 오브젝트를 선택하고 총알이 나올 수 있는 포인트를 만들어 주어야 합니다

그래서 새로운 오브젝트를 Create Empty 를 생성하고 자식으로 이름을 sPoint라고 합니다

GunCtrl 스크립트 수정

아래와 같이 GunCtrl 스크립트를 수정합니다

using System.Collections; using System.Collections.Generic; using UnityEngine; public class GunCtrl : MonoBehaviour { public GameObject bullet; public Transform sPoint; public float timeBetweenShots; private float shotTime; void Update() { //카메라 스크린의 마우스 거리와 총과의 방향 Vector2 direction = Camera.main.ScreenToWorldPoint(Input.mousePosition) – transform.position; //마우스 거리로 부터 각도 계산 float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg; //축으로부터 방향과 각도의 회전값 Quaternion rotation = Quaternion.AngleAxis(angle , Vector3.forward); transform.rotation = rotation; //마우스 왼쪽버튼을 눌렀을때 if (Input.GetMouseButton(0)) { if (Time.time >= shotTime) { //총알을 생성한다 Instantiate(bullet, sPoint.position, Quaternion.AngleAxis(angle – 90,Vector3.forward)); //재장전 총알 딜레이 shotTime = Time.time + timeBetweenShots; } } } }

수정된 GunCtrl 스크립트에 프리팹으로 만들었던 bullet과 Gun 오브젝트의 자식으로 있는 sPoint를 GunCtrl스크립트에 연결합니다

아래 동영상과 같이 총알이 나오는 것을 볼 수 있습니다

bullet 프리팹을 선택하여 BulletCtrl 스크립트를 생성하고 작성합니다

BulletCtrl 스크립트를 작성합니다

using System.Collections; using System.Collections.Generic; using UnityEngine; public class BulletCtrl : MonoBehaviour { public float speed; public float lifeTime; // Start is called before the first frame update void Start() { // 총알을 시간에 맞게 지운다 Destroy(gameObject, lifeTime); } // Update is called once per frame void Update() { // 시간프레임과 speed에 따라 y축방향으로 움직인다 transform.Translate(Vector2.up * speed * Time.deltaTime); } }

아래 동영상과 같이 마우스에 따라 총이 움직이고 총알이 마우스에 따라 방향대로 발사되는 것을 확인합니다

728×90

반응형

플레이어 총알 발사 구현하기!

안녕하세요!! 오늘은 슈팅게임에서 플레이어가 총알을 발사하는 코드에 대해서 알아보려고 합니다.

그 전에 스프라이트가 있어야합니다.

스프라이트 출처 : https://blog.naver.com/gold_metal/221709884923

1. 총알 발사 조건 정하기

public ObjectManager objectManager; public bool isButtonA; public float maxShotDelay; public float curShotDelay; void Update() { Fire(); Reload(); } public void ButtonADown() { isButtonA = true; } public void ButtonAUp() { isButtonA = false; } void Fire() { if (!isButtonA) return; if (curShotDelay < maxShotDelay) return; void Reload() { curShotDelay += Time.deltaTime; } 모든 버튼들은 Down, Up 함수가 있는데 Down은 버튼이 눌렸을 때, Up은 버튼을 누르다 뗏을 때입니다. 조건문 !isButtonA는 isButtonA가 false(! = 기준의 반대)라면 총알 발사 함수를 실행하지 않습니다. Up 함수는 안누르는 것을 의미하기 때문이죠. maxShotDelay는 총알 연사 속도를 제한합니다. Reload함수에서 curShotDelay를 현재 지나가고 있는 시간을 계속 더합니다. 제가 만약 maxShotDelay를 0.15로 설정해두면 0 ~ 0.14초 까지는 총알을 발사할 수 없는 것이죠. 2.총알 만들기 GameObject[] bulletPlayerA = new GameObject[100]; GameObject[] bulletPlayerB = new GameObject[100]; public GameObject MakeObj(string type) { switch (type) { case "BulletPlayerA": targetPool = bulletPlayerA; break; case "BulletPlayerB": targetPool = bulletPlayerB; break; } for (int index = 0; index < targetPool.Length; index++) { if (!targetPool[index].activeSelf) { targetPool[index].SetActive(true); return targetPool[index]; } } return null; } 이건 플레이어 파일 코드가 아닌 ObjectManager 스크립트의 함수입니다. 플레이어에서 총알을 생성하면 매개변수 type을 받아서 type의 값에 따라 targetPool의 값이 넣어집니다. for문에서는 타겟풀의 값, 즉 생성만 한 타겟풀의 개수만큼을 돌면서 비활성화된 index번째를 활성화 시키는 것이죠. 정리 : 타겟풀의 생성된 오브젝트 개수만큼 for문을 돌면서 비활성화가 되있는 index번째를 활성화시킨다. 3.총알 발사 로직 public int power; switch (power) { case 1: GameObject bullet = objectManager.MakeObj("BulletPlayerA"); bullet.transform.position = transform.position; Rigidbody2D rigid = bullet.GetComponent(); rigid.AddForce(Vector2.up * 10, ForceMode2D.Impulse); break; case 2: GameObject bulletR = objectManager.MakeObj(“BulletPlayerA”); bulletR.transform.position = transform.position + Vector3.right * 0.1f; GameObject bulletL = objectManager.MakeObj(“BulletPlayerA”); bulletL.transform.position = transform.position + Vector3.left * 0.1f; Rigidbody2D rigidR = bulletR.GetComponent(); Rigidbody2D rigidL = bulletL.GetComponent(); rigidR.AddForce(Vector2.up * 10, ForceMode2D.Impulse); rigidL.AddForce(Vector2.up * 10, ForceMode2D.Impulse); break; default: GameObject bulletRR = objectManager.MakeObj(“BulletPlayerA”); bulletRR.transform.position = transform.position + Vector3.right * 0.35f; GameObject bulletCC = objectManager.MakeObj(“BulletPlayerB”); bulletCC.transform.position = transform.position; GameObject bulletLL = objectManager.MakeObj(“BulletPlayerA”); bulletLL.transform.position = transform.position + Vector3.left * 0.35f; Rigidbody2D rigidRR = bulletRR.GetComponent(); Rigidbody2D rigidCC = bulletCC.GetComponent(); Rigidbody2D rigidLL = bulletLL.GetComponent(); rigidRR.AddForce(Vector2.up * 10, ForceMode2D.Impulse); rigidCC.AddForce(Vector2.up * 10, ForceMode2D.Impulse); rigidLL.AddForce(Vector2.up * 10, ForceMode2D.Impulse); break; } curShotDelay = 0; }

power의 값을 1 ~ 3까지 넣는다고 가정하면 switch문을 통해 power 값이 1이면 작은 총알, 2이면 양옆의 작은 총알, 값이 3이상이라면 기본으로 좌,우,중간(큰 총알)으로 발사하는 것이죠.

일단 이 코드는 슈팅게임 초반부분이라면 이해도 잘안가실 수 있습니다.

유니티 창에서 해야하는 것들을 제가 다 넣기도 애매해서 코드만 넣었습니다…

구체적인 정보는 영상을 보시는게 좋으실 것 같네요!!

다음편은 오브젝트 풀링을 사용 해야하는 이유로 올리도록 하겠습니다~~!

Unity – 총알 구현하기(Bullet)

1. 구현방법 생각하기

1) 총알 만들기(Bullet)

이동, 충돌 처리, 이펙트 재생

2) 총알 나오는 곳(Bullet Shooter)

회전, 총알생성

2. 구현

1) 총알 만들기(Bullet)

마음에 드는 Sprite를 가져다가 만듬 (나는 y축+ 쪽이 머리인 스프라이트를 선택함)

총알은 앞으로 나가야 하기 때문에 rigidbody2D 설정 + Kinematic 설정

-> Script에서 velocity 설정할 것

총알은 Collider를 만나면 처리해야 함으로 Collider 추가 + Trigger 설정

-> OnTriggerEnter2D 사용 할 것

Bullet Component

우선 앞으로 이동하기만 하면됨, 코드는 아래와 같음

-> 앞으로만 이동해야 하는데 자기 회전값에 대한 앞임, transform.up 신경써야 함

1 2 3 4 5 6 7 8 9 10 private Rigidbody2D rigid; private void Start() { rigid = GetComponent < Rigidbody2D > (); Destroy(gameObject, lifeTime); } private void Update() { rigid.velocity = transform.up * speed; } Colored by Color Scripter cs

또한 충돌처리 해줘야 함

파티클(or음악) 재생 + 데미지관련함수 + 총알꺼주기

코드는 아래와 같음

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public ParticleSystem explosionParticle; private void OnTriggerEnter2D(Collider2D other) { if (other.tag = = “Enemy” ) { //Play Particle ParticleSystem instance = Instantiate(explosionParticle, transform.position, Quaternion.identity); instance.Play(); Destroy(instance.gameObject, instance.main.duration); //Take Damage //따로 구현필요 //Set Active off Destroy(gameObject); } } Colored by Color Scripter cs

particle은 직접 만들거나 asset store에서 무료받아 사용하면 됨, 여기서는 Bullet의 Audio는 구현하지 않음

particle직접 만들어보는 것도 나쁘지 않음, 추후에 업로드 하겠음

위의 코드에서 Destory는 좋은 코드가 되지 못함

-> 생성 후 파괴를 계속하여 오버헤드 생김

-> 원래는 Objectpool에서 가져오는 것이 맞음 (여기서는 살펴보지 않음)

이러한 Bullet을 Prefab으로 만들어 둠

앞으로 가는 총알

cf) Enemy도 Rigidbody + Collider Trigger

2) 총알 나오는 곳(Bullet Shooter)

플레이어가 회전 중인 상태에 적절한 타이밍을 맞춰 상대를 맞추는 것을 구현하려 함

-> 마우스를 클릭하면 총알이 Bullet Shooter에서 나옴

플레이어가 회전 중일 때 Shooter도 회전해야 하므로 자식으로 설정

player에 스크립트 추가하여 초당 z축 회전을 시켜줌

-> 그럼 Bullet Shooter도 회전할 것

1 2 3 4 void Update()//script in player { transform.Rotate( 0 , 0 , 360 * Time.deltaTime); } Colored by Color Scripter cs

Bullet Shooter에서는 위에서 만든 Bullet을 public으로 가져와 사용

마우스를 누르면 총알을 생성함

-> 원래 Objectpool을 이용해서 가져오는게 효율적임, 여기서는 편의상

코드는 아래와 같음

1 2 3 4 5 6 7 8 public GameObject bullet; void Update() //script in bulletshooter { if (Input.GetMouseButtonDown( 0 )) { Instantiate(bullet, transform.position, transform.rotation); } } Colored by Color Scripter cs

3. 결과

4. 전체코드

Bullet

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 using System .Collections; using System .Collections.Generic; using UnityEngine; public class Bullet : MonoBehaviour { public ParticleSystem explosionParticle; public float speed = 5. 0f; public float lifeTime = 10. 0f; private Rigidbody2D rigid; private void Start() { rigid = GetComponent < Rigidbody2D > (); Destroy(gameObject, lifeTime); } private void Update() { rigid.velocity = transform.up * speed; } private void OnTriggerEnter2D(Collider2D other) { if (other.tag = = “Enemy” ) { //Play Particle ParticleSystem instance = Instantiate(explosionParticle, transform.position, Quaternion.identity); instance.Play(); Destroy(instance.gameObject, instance.main.duration); //Take Damage //Set Active off Destroy(gameObject); } } } Colored by Color Scripter cs

BulletShooter

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 using System .Collections; using System .Collections.Generic; using UnityEngine; public class BulletShooter : MonoBehaviour { public GameObject bullet; void Update() { if (Input.GetMouseButtonDown( 0 )) { Instantiate(bullet, transform.position, transform.rotation); } } } Colored by Color Scripter cs

Player

1 2 3 4 5 6 7 8 9 10 11 12 using System .Collections; using System .Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { void Update() { transform.Rotate( 0 , 0 , 360 * Time.deltaTime); } } Colored by Color Scripter cs

=== 참고 ===

Bullet이 앞으로만 간다고 해서 Vector3.up 쓰면 안됌

자신의 회전에 따른 앞(local.up)이므로 transform.up 씀에 명심

1. Vector3.up -> global

2. transform.up -> local

유니티-8방향으로 총알을 발사하다.

반응형

타임 파이럿 처럼

8방향으로 움직이면서 사방으로 총알을 쏘기위해서는

https://soo0100.tistory.com/1553

위 8방향으로 이동 포스팅 이후

8방향으로 총알을 쏘는 방법을 구현해 본다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 using System .Collections; using System .Collections.Generic; using UnityEngine; public class OnFire : MonoBehaviour { public GameObject missilePrefab; public int maxCount = 20 ; private float offSetX = 1. 5f; // 비행체와 미사일 간격 private float offSetY = – 0. 4f; // 비행체와 미사일 간격 private int direction = 0 ; // 오른쪽 bool pushFlag = false ; // 미사일 // Update is called once per frame void Update() { if (Input.GetKey( “right” )) // 오른쪽 키가 눌렸을때. { direction = 0 ; offSetX = 1. 5f; offSetY = – 0. 4f; } else if (Input.GetKey( “left” )) // 왼쪽 키가 눌렸을때. { direction = 1 ; offSetX = – 1. 5f; offSetY = – 0. 4f; } else if (Input.GetKey( “up” )) // 오른쪽 키가 눌렸을때. { direction = 2 ; offSetX = 0f; offSetY = 1. 5f; } else if (Input.GetKey( “down” )) // 오른쪽 키가 눌렸을때. { direction = 3 ; offSetX = 0f; offSetY = – 1. 5f; } if (Input.GetKey( “right” ) & & Input.GetKey( “up” )) { direction = 4 ; offSetX = 1. 5f; offSetY = 1. 5f; } if (Input.GetKey( “left” ) & & Input.GetKey( “up” )) { direction = 5 ; offSetX = – 1. 5f; offSetY = 1. 5f; } if (Input.GetKey( “right” ) & & Input.GetKey( “down” )) { direction = 6 ; offSetX = 1. 5f; offSetY = – 1. 5f; } if (Input.GetKey( “left” ) & & Input.GetKey( “down” )) { direction = 7 ; offSetX = – 1. 5f; offSetY = – 1. 5f; } if (Input.GetKey(KeyCode.Space)) // 스페이스가 눌렸을때 { if (pushFlag = = false ) { pushFlag = true ; Vector3 area = GetComponent < SpriteRenderer > ().bounds.size; Vector3 newPos = this .transform.position; newPos.x + = offSetX; newPos.y + = offSetY; //프리팹을 만든다. GameObject missile = Instantiate(missilePrefab) as GameObject; newPos.z = – 5 ; missile.transform.position = newPos; Debug.Log( “direction = ” + direction); Rigidbody2D rbody = missile.GetComponent < Rigidbody2D > (); if (direction = = 0 ) rbody.AddForce(Vector2.right * 20 , ForceMode2D.Impulse); else if (direction = = 1 ) //왼쪽 rbody.AddForce(Vector2.left * 20 , ForceMode2D.Impulse); else if (direction = = 2 ) //위 rbody.AddForce(Vector2.up * 10 , ForceMode2D.Impulse); else if (direction = = 3 ) //아래 rbody.AddForce(Vector2.down * 10 , ForceMode2D.Impulse); else if (direction = = 4 ) //오른쪽 대각선 위(X축 10, Y축 10 만큼의 힘 주기) rbody.AddForce( new Vector2( 10 , 10 ), ForceMode2D.Impulse); else if (direction = = 5 ) //왼쪽 대각선 위 rbody.AddForce( new Vector2( – 10 , 10 ), ForceMode2D.Impulse); else if (direction = = 6 ) //오른쪽 밑 rbody.AddForce( new Vector2( 10 , – 10 ), ForceMode2D.Impulse); else if (direction = = 7 ) //왼쪽 밑 rbody.AddForce( new Vector2( – 10 , – 10 ), ForceMode2D.Impulse); } else { pushFlag = false ; } } } } Colored by Color Scripter cs

위 코드에서 중요한점은 바로.

rbody.AddForce 함수이다.

하기 라인을 해석하자면, X축으로 10의 힘을, Y축으로 10의 힘을 주어서 발사하라는 의미로 해석될 수 있다.

즉, X,Y축 10씩의 힘은 바로 대각선으로 쏜다는 의미이다.

rbody.AddForce(new Vector2(10, 10), ForceMode2D.Impulse);

이렇게 구현하면, 손쉽게 여러방향으로의 총알 구현이 가능하다.

감사합니다 ^^

반응형

레이저 발사하기 · 유니티로 2D 슈팅게임 만들기

7일차 – 레이저 발사하기

우선 아까 만든 레이저 프리펩을 이용하여 레이저가 발사 되도록 구현할건데요, Player.cs 안에 다음과 같은 멤버 변수를 추가해 줍시다.

public GameObject laserPrefab; //발사할 레이저를 저장합니다. public bool canShoot = true; //레이저를 쏠 수 있는 상태인지 검사합니다. const float shootDelay = 0.5f; //레이저를 쏘는 주기를 정해줍니다. float shootTimer = 0; //시간을 잴 타이머를 만들어줍니다.

그다음엔 ShootControl 함수를 만들어서 레이저를 쏘도록 구현할건데요.

void ShootControl() // 발사를 관리하는 함수 입니다. { if (canShoot) // 쏠 수 있는 상태인지 검사합니다. { if (shootTimer > shootDelay && Input.GetKey(KeyCode.Space)) //쿨타임이 지났는지와, 공격키인 스페이스가 눌려있는지 검사합니다. { Instantiate(laserPrefab, transform.position, Quaternion.identity); //레이저를 생성해줍니다. shootTimer = 0; //쿨타임을 다시 카운트 합니다. } shootTimer += Time.deltaTime; //쿨타임을 카운트 합니다. } }

스페이스바를 누르면 레이저가 나갑니다!

유니티13_게임 제작 과정_03_미사일 발사

발사 기능 구현

만약 우주선이 총알이나 미사일 같은 무기를 발사하는 기능이 있다면 이것을 어떻게 구현할 지 알아본다.

무기를 발사한다면 다음과 같은 과정이 일반적이다.

총알 만들기 어떤 방향으로 움직이기 일정 시간 후 사라지기

총알 만들기

무기는 게임 도중에 공격할 때 마다 만들어져야 한다.

이렇듯 게임 실행 도중에 스크립트로 게임오브젝트를 만드는 작업을 ‘런타임 생성(Instantiate a gameobject at runtime)’ 이라고 한다.

이런 게임오브젝트를 만들 수 있는 기능이 프리팹(Prefab)이다.

*prefab : Prefabricate의 준말. 사전에 미리 만들어 두다.

즉, 게임오브젝트를 미리 준비해 두었다가 필요할 때 만들거나, 복사해서 대량으로 만들 때 유용하다.

prefab을 사용하려면 먼저 게임오브젝트를 Assets 폴더에 저장하고, 이것을 사용해서 게임오브젝트를 생성한다.

프리팹(Prefab) 만들기

먼저 앞에서 Scripts폴더를 만든것 처럼 프리팹만을 모아서 관리할 수 있도록 Assets 폴더에 Prefabs 폴더를 만든다.

그 다음 ‘빈 게임오브젝트’를 만들고 이름을 Bullet (총알)이라고 하자.

이렇게 만든 Bullet 게임오브젝트를 프리팹으로 만들고 싶으면 Prefabs폴더로 끌어서 놓는다.

그러면 다음과 같은 프리팹이 만들어진다.

프리팹 설정

Project창의 Bullet 프리팹을 더블클릭하거나 아래 그림에서 Open Prefab(프리팹 열기) 버튼을 클릭하면 설정 모드로 들어갈 수 있다.

Bullet 이미지를 넣기 위해 앞에서 했던것 처럼 Add Component 버튼으로 Sprite Renderer 컴퍼넌트를 추가한다.

Sprite(스프라이트)는 Knob를 선택한다.

Scene탭을 눌러서 씬뷰(화면 보기)로 가면 프리팹이 나타난다.

바로 아래 있는 Color를 빨간색으로 바꾼다.

이렇게 하면 Assets폴더의 Prefabs 폴더에 있는 Bullet(빨간색)과 Hierarchy창에 있는 Bullet (흰색)을 구분할 수 있다.

설정을 완료했으면 Hierarchy창의 뒤로가기 화살표를 클릭해서 Bullet 프리팹에서 빠져나간다.

Bullet과 Ship의 크기도 서로 같으므로 Ship의 크기(Scale)에서 X, Y를 3으로 조정한다.

스크립트로 프리팹 만들기

Bullet프리팹은 Ship에서 발사하기 때문에 ShipControl 스크립트에서 프리팹을 만들어낼 수 있다.

8번줄 : 먼저 게임오브젝트 BulletPrefab 이라는 변수를 public으로 선언한다.

연결된 Ship의 스크립트 컴퍼넌트에 선언한 변수가 나타난다.

위 그림에서는 현재 프리팹으로 사용할 게임오브젝트가 없는 상태(None)다.

설정 버튼을 클릭한 후 Assets에 있는 프리팹 Bullet을 선택한다.

실제로 프리팹을 생성하려면 코드를 작성해야 한다.

33~36번줄 코드를 추가한다.

33번줄: GetKeyDown() 메서드는 설정한 키(Space)가 눌러졌을 때 한번만 체크한다.

35번줄: Instantiate() 메서드는 괄호 안의 인수로 전달된 게임오브젝트를 생성하고 반환한다.

이렇게 생성한 프리팹은 게임오브젝트 Bullet에 저장한다.

참고로 Instantiate()메서드는 Object타입을 반환한다. 그래서 GameObject타입으로 casting(명시적 타입 변환)하고 싶으면 Instantiate(BulletPrefab) as GameObject 로 적으면 된다.

또한 매개변수를 가진 프리팹도 반환 받을 수 있다.

Instantiate(Object gameObject, Vector3 position, Quaternion rotation)

예를 들면 Instantiate(prefab, new Vector3(0,0,0), Quaternion.identity)

*Quaternion.identity : 회전 없음

스크립트를 저장한 후 실행한다.

스페이스바 키를 누를 때마다 프리팹으로 만든 Bullet이 복제(Clone)되어 게임씬에 만들어진다.

그런데 Ship을 움직여 보면 Bullet은 따라 움직이지 않는다.

우주선 위치에 프리팹이 만들어지도록 코드를 수정한다.

36번줄

Bullet의 위치(position)에 Ship의 위치(position)를 저장하라는 코드이다.

이렇게 하면 프리팹이 생성될 때 Ship 위치가 Bullet 위치에 저장되어 만들어질 것이다.

Bullet 프리팹 발사하기

스페이스바 키를 누르면 Bullet 프리팹이 만들어지므로 이제 움직이게 해보자.

게임오브젝트에 속도를 주는 방법은 유니티의 물리엔진이 속도를 제어하는 Rigidbody2D 컴퍼넌트가 대표적이다.

*rigidbody: 뉴턴 역학에서 실제 물체를 모형화 하기 위해 만든, 모양과 크기가 바뀌지 않는 단단한 고체

제일 먼저 해야할 일은 Bullet프리팹에 Rigidbody2D 컴퍼넌트 추가하는 것이다.

Assets–Prefabs 폴더에 있는 Bullet을 더블클릭한 후 Add Component버튼을 사용하여 추가한다.

Rigidbody2D 컴퍼넌트를 추가한 후 Gravity Scale(중력 크기)를 1에서 0으로 수정한다.

중력 크기는 y축 음의 방향으로 힘을 받아 세로축 아래로 움직이기 때문에 여기서는 0으로 한다.

Bullet 프리팹 움직임 스크립트

속도를 제어하는 Rigidbody2D 컴퍼넌트를 추가했으므로 이제 프리팹을 움직이도록 스크립트를 작성한다.

37번줄: Bullet에 GetComponent 메서드를 이용해서 속도를 제어하는 Rigidbody2D컴퍼넌트를 가져온다.

그리고 속도를 주기 위해서는 Rigidbody2D 클래스에 정의되어 있는 AddForce 메서드를 이용하면 된다.

위쪽(세로축 양의 방향)으로 힘을 주기 위해 Vector2.up을 인수로 넣어준다.

GetComponent( ) 메서드는 GameObject(게임오브젝트)의 컴퍼넌트를 가져올 때 사용한다.

< >괄호는 generic(제네릭)이라고 하는데 여기에 가져올 컴퍼넌트의 타입, 예를 들어 Transform, Rigidbody2D 등을 입력한다. 제네릭에 대해서는 나중에 C# 학습에서 살펴볼 것이다.

component(컴퍼넌트)는 ‘구성 요소’라는 뜻이므로 get component는 ‘구성요소를 가져오다’라는 뜻이다.

유니티에서 GetComponent 메서드는 다른 오브젝트(객체)를 가져올 때 사용한다.

스크립트를 저장 후 스페이스바를 누르면 Bullet프리팹이 만들어져 앞으로 조금씩 움직일 것이다.

이제 속도를 높일 수 있는 방법을 알아본다.

앞에서 speed를 만든것 처럼 float타입의 BulletSpeed변수를 public으로 만든다.

이렇게 만든 변수를 Vector2.up에 곱해서 속도를 높여준다.

스크립트를 저장한 후 Inspector창에 생성된 BulletSpeed 값을 100으로 설정하고 테스트 해본다.

Bullet프리팹 사라지게 하기

Bullet프리팹이 생성된 후 일정 시간이 지나서 사라지게 하려면 어떻게 해야 할까?

게임오브젝트를 일정 시간 후 사라지게 하는 스크립트를 만들어서 Bullet프리팹에 연결해 주면 된다.

먼저 Scripts폴더에 Bullet이라는 새 스크립트 파일을 만든다.

Bullet스크립트를 Bullet프리팹에 연결한다.

Assets– Prefabs폴더에 있는 Bullet프리팹을 더블클릭해서 설정으로 들어간 후 Add Component버튼으로 스크립트를 추가한다.

검색창에 Bu를 입력하면 Bullet스크립트를 찾을 수 있다.

이제 Bullet 스크립트를 열어서 코드를 작성한다.

주석을 삭제하고 새로운 함수를 만들어 완성한 코드는 다음과 같다.

12번줄~15번줄

DestroyBullet 이라는 메서드를 만든다.

이 메서드의 기능은 게임오브젝트를 없애는 것이다.

게임오브젝트를 없애기 위해서는 Destroy( ) 를 사용한다.

*destroy : 파괴하다

Destroy() 메서드는 게임오브젝트를 없앨 때 사용하기 위해 상속받은 클래스에 이미 만들어져 있는 메서드이다.

컴퍼넌트 등과 같은 것도 없앨 수 있다.

괄호 안에는 없앨 대상을 적어 준다.

gameObject 는 Bullet을 나타낸다.

this.gameObject 라고 해도 된다.

this에 대해서는 이후 C# 학습에서 설명한다.

9번줄

게임오브젝트를 파괴하는 기능을 가진 DestroyBullet 메서드를 Start( )메서드에 넣어주면 되지만 여기서는 Bullet을 발사한 후 일정 시간이 지나서 메서드가 작동하도록 해야 한다.

이런 경우에는 Invoke( )메서드를 사용한다.

*invoke : 적용하다

Invoke( ) 메서드는 2개의 인수를 전달해야 한다.

첫번째 인수는 실행할 메서드명을 string(문자열) 형태로 표시한다.

두번째 인수는 메서드 실행을 지연하는 시간을 표시한다.

그러므로 9번줄은 DestroyBullet 메서드를 2초 후에 적용하라는 코드이다.

스크립트를 저장한 후 실행해 보면 만들어진 Bullet프리팹이 2초후에 게임뷰에서 사라지는 것을 확인할 수 있다.

Bullet 프리팹 여러 개 발사하기

스페이스바 키를 한번 눌렀을 때 Bullet을 여러 개 발사하려면 아래 코드처럼 Bullet 수 만큼 코드를 만들어야 한다.

이런 경우에 반복문을 이용해서 코드를 작성하면 다음과 같다.

36번줄

for 반복문의 실행 부분에 Bullet 발사 코드를 넣는다.

조건식에는 카운터로 사용할 변수 i를 만들어 0으로 초기화하고, i가 2보다 작을 때 까지, i값을 1씩 증가한다.

즉, i가 0, 1 일 때 Bullet을 발사하게 된다.

스크립트를 저장한 후 실행해본다.

실행 후 스페이스바 키를 누르면 Bullet 복제(Clone)는 2개 만들어져서 발사된다.

그런데 게임뷰에서는 2개가 함께 이동하는 것을 확인할 수 있다.

이 문제를 해결하려면 어떻게 해야 할까?

39번줄

Vector3 타입의 변수 bulletPosition(총알 위치)을 만들고 현재 위치를 저장한다.

40번줄

세로 축인 y값에 0.5 에 변수i를 곱한 값을 더해서 저장한다.

41번줄

Bullet의 위치(position)에 bulletPosition값을 저장한다.

그러면 처음 만들어지는 Bullet은 y값에 0 , 두번째 Bullet은 y값에 0.5 가 더해져서 위치가 정해진다.

아래와 같이 변수i는 증가하므로 AddForce 메서드에 값을 곱해서 속도를 다르게 하는 방법도 만들 수 있다.

끝.

Wraven…

키워드에 대한 정보 유니티 2d 총알 발사

다음은 Bing에서 유니티 2d 총알 발사 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 [유니티2D] 총알을 쏴보자! 뿌슝!

  • 유니티
  • Unity
  • c#
  • 게임만들기
  • 총알발사
  • 유니티 원거리 공격
  • 유니티 공격
  • 유니티 Attack
  • Raycast
  • GameDev
  • 원거리공격
  • 유니티 미사일
[유니티2D] #총알을 #쏴보자! #뿌슝!


YouTube에서 유니티 2d 총알 발사 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 [유니티2D] 총알을 쏴보자! 뿌슝! | 유니티 2d 총알 발사, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  너츠 베리 팜 할인 | 미국 놀이공원에 가요 | Knott'S Berry Farm | 미국 맥도날드 | 캘리포니아 놀이공원 노츠베리팜 | 얼바인 근처 놀 곳 | 상위 142개 베스트 답변

Leave a Reply

Your email address will not be published. Required fields are marked *