Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Unity Course for beginner on K3

NWaka
April 27, 2021

Unity Course for beginner on K3

計算技術研究会にて,2019-05-19に行われたUntiy初心者向け講座の資料(公開版)。
受講前提の資料なので細かい部分は省いている箇所があります。ご了承ください。

NWaka

April 27, 2021
Tweet

More Decks by NWaka

Other Decks in Technology

Transcript

  1. ゲームをつくろう!~シーン遷移編~ public class StartSceneManager : MonoBehaviour { // Start is

    called before the first frame update void Start() { } // Update is called once per frame void Update() { } }
  2. ゲームをつくろう!~シーン遷移編~ public class StartSceneManager : MonoBehaviour { // Update is

    called once per frame void Update() { if (Input.GetKeyDown(KeyCode.Space)) { //ゲームシーンに遷移 SceneManager.LoadSceneAsync("GameScene"); } } } 押した瞬間 シーン遷移
  3. ゲームをつくろう!~シーン遷移編~ public class StartSceneManager : MonoBehaviour { // Update is

    called once per frame void Update() { if (Input.GetKeyDown(KeyCode.Space)) { //ゲームシーンに遷移 SceneManager.LoadSceneAsync("GameScene"); } } } 波かっこ { } セミコロン ;
  4. ゲームをつくろう!~シーン遷移編~ Scene 'GameScene' couldn't be loaded because it has not

    been added to the build settings or the AssetBundle has not been loaded. どんなエラー? To add a scene to the build settings use the menu File->Build Settings... UnityEngine.SceneManagement.SceneManager:LoadSceneAsync(String) StartSceneManager:Update() (at Assets/C#Scripts/StartSceneManager.cs:14)
  5. ゲームをつくろう!~シーン遷移編~ Scene 'GameScene' couldn't be loaded because it has not

    been added to the build settings or the AssetBundle has not been loaded. どんなエラー? GameSceneがロードできなかった。なんでかっていうと,ビ ルド設定かアセットバンドルの方でロードされていなかったか らさ。だってさ
  6. ゲームをつくろう!~シーン遷移編~ どんなエラー? To add a scene to the build settings

    use the menu File->Build Settings... UnityEngine.SceneManagement.SceneManager:LoadSceneAsync(String) StartSceneManager:Update() (at Assets/C#Scripts/StartSceneManager.cs:14) メニューのFile>Build Settingsの手順でビルド設定からシー ンを追加しろってさ どこでエラーになっているのかを示している
  7. public class Player : MonoBehaviour { private float _speed; //

    Start is called before the first frame update void Start() { _speed = 0.1f; } // Update is called once per frame void Update() { if (Input.GetKey(KeyCode.LeftArrow)) { //左矢印キーが押されたら transform.Translate(-_speed, 0, 0); } if (Input.GetKey(KeyCode.RightArrow)) { //右矢印キーが押されたら transform.Translate(_speed, 0, 0); } } } ゲームをつくろう!~自機を動かす編~ 引数に与えられたx,y,z分加算したポジションに移動 押している間
  8. ゲームをつくろう!~自機を動かす編~ public class GameSceneManager : MonoBehaviour { private Camera _camera;

    private float _leftCameraWorldPos; private float _rightCameraWorldPos; // Start is called before the first frame update void Start() { _camera = GameObject.Find("Main Camera").GetComponent<Camera>(); _leftCameraWorldPos = _camera.ViewportToWorldPoint(new Vector3(0, 0)).x; _rightCameraWorldPos = _camera.ViewportToWorldPoint(new Vector3(1, 1)).x; } public float LeftCameraWorldPos => _leftCameraWorldPos; public float RightCameraWorldPos => _rightCameraWorldPos; } Main Cameraって名前のオブジェクトを探す コンポーネントCameraを取得
  9. ゲームをつくろう!~自機を動かす編~ private float _speed; private GameSceneManager _gameSceneManager; // Start is

    called before the first frame update void Start() { _speed = 0.1f; _gameSceneManager = GameObject.Find("GameSceneManager").GetComponent<GameSceneManager>(); if (_gameSceneManager == null) Debug.LogError("Error!"); }
  10. ゲームをつくろう!~自機を動かす編~ // Update is called once per frame void Update()

    { if (transform.position.x <= _gameSceneManager.LeftCameraWorldPos) { //左端 transform.position = new Vector3(_gameSceneManager.LeftCameraWorldPos, transform.position.y); } if (transform.position.x >= _gameSceneManager.RightCameraWorldPos) { //右端 transform.position = new Vector3(_gameSceneManager.RightCameraWorldPos, transform.position.y); }
  11. おまけ~他の動かし方~ if (Input.GetKey(KeyCode.LeftArrow)) { //左矢印キーが押されたら Vector2 pos = transform.position; transform.position

    = new Vector3( Mathf.Clamp(pos.x - _speed, _gameSceneManager.LeftCameraWorldPos, _gameSceneManager.RightCameraWorldPos), pos.y); } if (Input.GetKey(KeyCode.RightArrow)) { //右矢印キーが押されたら Vector2 pos = transform.position; transform.position = new Vector3( Mathf.Clamp(pos.x + _speed, _gameSceneManager.LeftCameraWorldPos, _gameSceneManager.RightCameraWorldPos), pos.y); }
  12. おまけ~他の動かし方~ if (Input.GetKey(KeyCode.UpArrow)) { //上矢印キーが押されたら Vector2 pos = transform.position; transform.position

    = new Vector3(pos.x, Mathf.Clamp(pos.y + _speed, _gameSceneManager.BottomCameraWorldPos, _gameSceneManager.TopCameraWorldPos)); } if (Input.GetKey(KeyCode.DownArrow)) { //下矢印キーが押されたら Vector2 pos = transform.position; transform.position = new Vector3(pos.x, Mathf.Clamp(pos.y - _speed, _gameSceneManager.BottomCameraWorldPos, _gameSceneManager.TopCameraWorldPos)); }
  13. ゲームをつくろう!~敵をつくる編~ /// <summary> /// 当たり判定 /// </summary> /// <param name="other"></param>

    private void OnTriggerEnter2D(Collider2D other) { Debug.Log("hoge"); } Triggerでコライダーが接触したら呼ばれる 2Dだぞ!☆
  14. ゲームをつくろう!~敵をつくる編~ private int _hp; void Start() { _speed = 0.1f;

    _hp = 100; /// <summary> /// 当たり判定 /// </summary> /// <param name="other"></param> private void OnTriggerEnter2D(Collider2D other) { if (other.CompareTag("Enemy")) { //ぶつかったのがEnemyだったら _hp -= 10; if (_hp <= 0) _hp = 0; } } タグを与えられた文字列と比較して, 同じだったらtrue
  15. ゲームをつくろう!~敵をつくる編~ Player.cs GameSceneManager.cs private void OnTriggerEnter2D(Collider2D other) { if (other.CompareTag("Enemy"))

    { //ぶつかったのがEnemyだったら _hp -= 10; if (_hp <= 0) _hp = 0; _gameSceneManager.SetHitPoint(_hp); } } [SerializeField] private Text _hpText; public void SetHitPoint(int hp) { _hpText.text = $" {hp}"; } void Start() { ~~省略~~ _gameSceneManager.SetHitPoint(_hp); } Unity Editor上で 編集できるようになる
  16. ゲームをつくろう!~弾をつくる編~ public class Bullet : MonoBehaviour { private Rigidbody2D _rigidbody2D;

    private float _time; // Start is called before the first frame update void Start() { _rigidbody2D = GetComponent<Rigidbody2D>(); _rigidbody2D.velocity = new Vector2(0f, 10f); _time = 1f; } void Update() { if (_time <= 0) Destroy(gameObject); _time -= Time.deltaTime; } } 速度を設定 オブジェクトを消す 経った時間
  17. ゲームをつくろう!~弾をつくる編~ if (Input.GetKeyDown(KeyCode.Space)) { //ゲームオブジェクトを作成 GameObject shotInstance = Instantiate(_shotPrefab); //ポジションをShooterにする

    shotInstance.transform.position = gameObject.transform.position; } Update内にSpaceを押した際の挙動を記述 プレハブの定義 [SerializeField] private GameObject _shotPrefab = null; オブジェクトを生成
  18. ゲームをつくろう!~敵を増やす編~ public class Enemy : MonoBehaviour { [SerializeField] private int

    _attackPower = 10; private Rigidbody2D _rigidbody2D; void Start() { _rigidbody2D = GetComponent<Rigidbody2D>(); _rigidbody2D.velocity = new Vector2(0f, -1f); } public int AttackPower => _attackPower; }
  19. ゲームをつくろう!~敵を増やす編~ [SerializeField] private GameObject _enemyPrefab = null; [SerializeField] private int

    _enemyNumber = 10; for (int i = 0; i < _enemyNumber; i++) { GameObject enemy = Instantiate(_enemyPrefab); enemy.transform.position = new Vector3(Random.Range(_leftCameraWorldPos, _rightCameraWorldPos), Random.Range(_topCameraWorldPos, _topCameraWorldPos + 5f)); } Startに敵の生成を記述
  20. ゲームをつくろう!~ゲームオーバー編~ private bool _isGameOver; private bool _isGameClear; private float _time;

    _isGameOver = false; _isGameClear = false; _time = 0.5f; [SerializeField] private GameObject _gameOverPanel = null; [SerializeField] private GameObject _gameClearPanel = null;
  21. ゲームをつくろう!~ゲームオーバー編~ _gameOverPanel.SetActive(false); _gameClearPanel.SetActive(false); public void GameOver() { _isGameOver = true;

    _gameOverPanel.SetActive(true); } public void GameClear() { _isGameClear = true; _gameClearPanel.SetActive(true); } false:□ True:✅
  22. ゲームをつくろう!~ゲームオーバー編~ private void Update() { //スタート画面に戻す if (_time <= 0)

    SceneManager.LoadSceneAsync("StartScene"); if (_isGameClear) _time -= Time.deltaTime; else if (_isGameOver) _time -= Time.deltaTime; }
  23. ゲームをつくろう!~使いまわし編~ 初期化用メソッドをEnemyに public void Initialize(Vector2 pos) { transform.position = pos;

    gameObject.SetActive(true); _rigidbody2D.velocity = new Vector2(0f, -1f); } _enemies = new List<Enemy>(); for (int i = 0; i < _enemyNumber; i++) { Enemy enemy = Instantiate(_enemyPrefab).GetComponent<Enemy>(); enemy.Initialize(ResetPos()); _enemies.Add(enemy); } private List<Enemy> _enemies; Enemyスクリプトを 保持できるリスト
  24. ゲームをつくろう!~使いまわし編~ BulletのDestroyをSetActive に変える Updateで確認 foreach (Enemy enemy in _enemies) {

    if (!enemy.gameObject.activeSelf) enemy.Initialize(ResetPos()); } if (other.CompareTag("Enemy")) { //敵を消し other.gameObject.SetActive(false);