Unity2D_Basic#4
210721
Unity2D_Basic#4 Instantiate() を使用
ネストされた重複文を使用すると、必要なシェイプに従ってオブジェクトを配置および作成できます.
ObjectSpawner.cs
任意の接頭辞を使用してオブジェクトを作成する
1.円、三角形の接頭辞を作成する
2.ObjectSpawner.cs
minからmax-1までの整数の任意の数値をvalueに保存
float value = Random.Range(float min, float max);
上と同じ整数->実数
3.prefabarray数を入力してprefabを指定する
実行画面
各実行で任意のprefabを選択して作成
任意の場所にオブジェクトを作成する
SpawnPointからオブジェクトを作成
1.空のオブジェクトを作成し、SpwinPoint 1,2として指定して配置
2.ObjectSpowner を修正する
実行時に1つのポイントを集中的に生成するので、正確に確認するのは難しい.
を確認するために行動する.
Movement2D.cs修正
各位置は0.5秒ごとに生成を確認できます.
それを射撃ゲームに応用する
プレイヤーに特定のボタンを押したときに作成させるとしたら?
プレーヤーオブジェクトの作成->playercontroller.cs作成
-PlayerController.cs
上記のように、この位置でのみ生成されます.
動かしてみます.
-PlayerController.csの変更
リファレンス
https://www.inflearn.com/course/%EA%B3%A0%EB%B0%95%EC%82%AC-%EC%9C%A0%EB%8B%88%ED%8B%B0-%EA%B8%B0%EC%B4%88/dashboard
Unity2D_Basic#4
ネストされた重複文を使用すると、必要なシェイプに従ってオブジェクトを配置および作成できます.
ObjectSpawner.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectSpawner : MonoBehaviour
{
[SerializeField]
private GameObject boxPrefab;
private void Awake()
{
// 외부 반복문 (격자의 y축)
for (int y = 0; y < 10; ++y)
{
// 내부 반복문 (격자의 x축)
for (int x = 0; x < 10; ++x)
{
if(x == y || x+y == 9)
{
continue;
}
Vector3 position = new Vector3(-4.5f + x, 4.5f - y, 0);
Instantiate(boxPrefab, position, Quaternion.identity);
}
}
}
}
任意の接頭辞を使用してオブジェクトを作成する
1.円、三角形の接頭辞を作成する
2.ObjectSpawner.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectSpawner : MonoBehaviour
{
[SerializeField]
private GameObject[] prefabArray;
private void Awake()
{
for (int i = 0; i < 10; ++i)
{
int index = Random.Range(0, prefabArray.Length);
Vector3 position = new Vector3(-4.5f + i, 0, 0);
Instantiate(prefabArray[index], position, Quaternion.identity);
}
}
}
int value = Random.Range(int min, int max);minからmax-1までの整数の任意の数値をvalueに保存
float value = Random.Range(float min, float max);
上と同じ整数->実数
3.prefabarray数を入力してprefabを指定する
実行画面
各実行で任意のprefabを選択して作成
任意の場所にオブジェクトを作成する
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectSpawner : MonoBehaviour
{
[SerializeField]
private int objectSpawnCount = 30;
[SerializeField]
private GameObject[] prefabArray;
private void Awake()
{
for (int i = 0; i < objectSpawnCount; ++i)
{
int index = Random.Range(0, prefabArray.Length);
float x = Random.Range(-7.5f, 7.5f); // x 위치
float y = Random.Range(-4.5f, 4.5f); // y 위치
Vector3 position = new Vector3(x, y, 0);
Instantiate(prefabArray[index], position, Quaternion.identity);
}
}
}
指定した数で任意の場所に作成1.空のオブジェクトを作成し、SpwinPoint 1,2として指定して配置
2.ObjectSpowner
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectSpawner : MonoBehaviour
{
[SerializeField]
private int objectSpawnCount = 30; // 생성 할 오브젝트의 개수
[SerializeField]
private GameObject[] prefabArray; // prefab의 배열
[SerializeField]
private Transform[] spawnPointArray; // 위치값을 가진다
private void Awake()
{
for (int i = 0; i < objectSpawnCount; ++i)
{
int prefabIndex = Random.Range(0, prefabArray.Length);
int spawnIndex = Random.Range(0, spawnPointArray.Length);
Vector3 position = spawnPointArray[spawnIndex].position;
GameObject clone = Instantiate(prefabArray[prefabIndex], position, Quaternion.identity);
}
}
}
指定点実行時に1つのポイントを集中的に生成するので、正確に確認するのは難しい.
Movement2D.cs修正
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Movement2D : MonoBehaviour
{
private float moveSpeed = 5.0f; // 이동 속도
private Vector3 moveDirection;
public void Setup(Vector3 direction)
{
moveDirection = direction;
}
private void Update()
{
transform.position += moveDirection * moveSpeed * Time.deltaTime;
}
}
ObjectSpawner.csの変更using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectSpawner : MonoBehaviour
{
[SerializeField]
private int objectSpawnCount = 30; // 생성 할 오브젝트의 개수
[SerializeField]
private GameObject[] prefabArray; // prefab의 배열
[SerializeField]
private Transform[] spawnPointArray; // 위치값을 가진다
private int currentObjectCount = 0; // 현재까지 생성한 오브젝트 개수
private float objectSpawnTime = 0.0f;
private void Update()
{
if(objectSpawnCount < currentObjectCount + 1) // 최대 생성 개수만큼 생성할 수 있도록
{
return;
}
// 원하는 시간마다 오브젝트 생성하도록 하는 연산
objectSpawnTime += Time.deltaTime; // 실제 초와 동일하게 실행
// 0.5초마다 실행
if(objectSpawnTime >= 0.5f)
{
int prefabIndex = Random.Range(0, prefabArray.Length);
int spawnIndex = Random.Range(0, spawnPointArray.Length);
Vector3 position = spawnPointArray[spawnIndex].position;
GameObject clone = Instantiate(prefabArray[prefabIndex], position, Quaternion.identity);
// spawnIndex가 1 -> 오브젝트가 왼쪽에 있기 때문에 오른쪽으로 이동
Vector3 moveDirection = (spawnIndex == 1 ? Vector3.right : Vector3.left);
clone.GetComponent<Movement2D>().Setup(moveDirection);
currentObjectCount++; // 현재 오브젝트 개수 증가
objectSpawnTime = 0.0f; // 시간 초기화 -> 0.5초를 계산을 위해서
}
}
}
Movement 2 D構成部品として各プリセットに追加各位置は0.5秒ごとに生成を確認できます.
それを射撃ゲームに応用する
プレイヤーに特定のボタンを押したときに作成させるとしたら?
プレーヤーオブジェクトの作成->playercontroller.cs作成
-PlayerController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField]
private KeyCode keyCodeFire = KeyCode.Space;
[SerializeField]
private GameObject bulletPrefab;
private float moveSpeed = 3.0f;
// Update is called once per frame
void Update()
{
// 플레이어 오브젝트 이동
float x = Input.GetAxisRaw("Horizontal");
float y = Input.GetAxisRaw("Vertical");
transform.position += new Vector3(x, y, 0) * moveSpeed * Time.deltaTime;
// bullet 발사
if (Input.GetKeyDown(keyCodeFire)) // 버튼을 누르면 실행
{
// clone을 생성 -> bulletPrefab을 생성, 현재 오브젝트의 위치
GameObject clone = Instantiate(bulletPrefab, transform.position, Quaternion.identity);
clone.name = "Bullet";
clone.transform.localScale = Vector3.one * 0.5f;
clone.GetComponent<SpriteRenderer>().color = Color.red;
}
}
}
実行時上記のように、この位置でのみ生成されます.
動かしてみます.
-PlayerController.csの変更
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField]
private KeyCode keyCodeFire = KeyCode.Space;
[SerializeField]
private GameObject bulletPrefab;
private float moveSpeed = 3.0f;
private Vector3 lastMoveDirection = Vector3.right; // 마지막에 움직였던 방향, 최초에는 오른쪽으로 이동하도록 한다
// Update is called once per frame
void Update()
{
// 플레이어 오브젝트 이동
float x = Input.GetAxisRaw("Horizontal");
float y = Input.GetAxisRaw("Vertical");
transform.position += new Vector3(x, y, 0) * moveSpeed * Time.deltaTime;
// 방향키를 누른 경우
if (x != 0 || y != 0)
{
lastMoveDirection = new Vector3(x, y, 0);
}
// bullet 발사
if (Input.GetKeyDown(keyCodeFire)) // 버튼을 누르면 실행
{
// clone을 생성 -> bulletPrefab을 생성, 현재 오브젝트의 위치
GameObject clone = Instantiate(bulletPrefab, transform.position, Quaternion.identity);
clone.name = "Bullet";
clone.transform.localScale = Vector3.one * 0.5f;
clone.GetComponent<SpriteRenderer>().color = Color.red;
clone.GetComponent<Movement2D>().Setup(lastMoveDirection); // 저장한 방향을 Movement2D의 Setup()이라는 함수에 방향값을 전달
}
}
}
lastMoveDirectionが追加されました.最後に移動した方向を覚えて、方向キーを押した後、保存した方向値で弾丸を発射します.リファレンス
https://www.inflearn.com/course/%EA%B3%A0%EB%B0%95%EC%82%AC-%EC%9C%A0%EB%8B%88%ED%8B%B0-%EA%B8%B0%EC%B4%88/dashboard
Reference
この問題について(Unity2D_Basic#4), 我々は、より多くの情報をここで見つけました https://velog.io/@kimhaech/Unity2DBasic-4-hym7z27dテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol