Unity2D_Basic#4


210721
Unity2D_Basic#4
  • Instantiate()
  • を使用
    ネストされた重複文を使用すると、必要なシェイプに従ってオブジェクトを配置および作成できます.
    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);
            }
        }
    }
    指定した数で任意の場所に作成
  • SpawnPointからオブジェクトを作成
    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