unity学習#7

4509 ワード

第3部
第六章-1:弾幕射撃ゲーム:ダギー
今週は、前回作成したプレーヤースクリプトPlayer Controllerを改良し、より良い操作感を実現しました.
まず、既存のPlayer Controlスクリプトは次のようになります.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public Rigidbody playerRigidbody; //이동에 사용할 리저드바디 컴포넌트
    public float speed = 8f; //이동 속력

    void Start()
    {
        
    }

    void Update()
    {
        if(Input.GetKey(KeyCode.UpArrow) == true) //위쪽 방향키 입력이 감지된 경우 z방향 힘 주기
        {
            playerRigidbody.AddForce(0f, 0f, speed);
        }
        if (Input.GetKey(KeyCode.DownArrow) == true) //위쪽 방향키 입력이 감지된 경우 -z방향 힘 주기
        {
            playerRigidbody.AddForce(0f, 0f, -speed);
        }
        if (Input.GetKey(KeyCode.RightArrow) == true) //위쪽 방향키 입력이 감지된 경우 x방향 힘 주기
        {
            playerRigidbody.AddForce(speed, 0f, 0f);
        }
        if (Input.GetKey(KeyCode.LeftArrow) == true) //위쪽 방향키 입력이 감지된 경우 -x방향 힘 주기
        {
            playerRigidbody.AddForce(-speed, 0f, 0f);
        }
    }
    
    public void Die() //게임 오브젝트 비활성화
    {
        gameObject.SetActive(false);
    }
}
これらのスクリプトは十分に利用できますが、いくつかの問題もあります.
1.操作がゲームにすぐに反映されない.
-最初のプレゼンテーションビデオで確認できる問題です.既存のAddForce()メソッドでは、十分な高速な力を追加するのに時間がかかります.移動中に逆方向に移動しようとすると、力は冠状面で相殺され、すぐに方向変換できません.これは操作が不便と見なされる可能性がある問題で、修正が必要です.
2.入力検出コードが複雑です.
-4つのifゲートを用いて方向キーを検出する効率が低下する.
3.playerRigidbodyコンポーネントのドラッグ&ドロップ割り当てが不便です.
-構成部品を変数に直接ドラッグ&ドロップする方法は不便であり、誤った値が割り当てられる可能性があるため、より直接的なコードを実行したいと考えています.
これらの問題を改善するために、スクリプトをいくつか修正しました.
第一に、3つ目の問題:playerRigidbody素子割り当ての問題を解決しました.
    private Rigidbody playerRigidbody; //이동에 사용할 리저드바디 컴포넌트
    public float speed = 8f; //이동 속력

    void Start()
    {
        //게임 오브젝트에서 Rigidbody 컴포넌트를 찾아 playerRigidbody에 할당
        playerRigidbody = GetComponent<Rigidbody>();
    }
変数PlayerRigidBodyのアクセス制限子をpublicからprivateに変更し、未使用のStart()メソッドセクションを変更して、変数PlayerRigidBodyにRidgedマスター構成部品の参照を割り当てます.
2つ目は、既存の更新方法を変更して、より良い操作感を生み出すことです.
```C#
void Update()
{
//水平軸と垂直軸の入力値の検出と保存
float xInput = Input.GetAxis("Horizontal");
float zInput = Input.GetAxis("Vertical");
    //실제 이동 속도를 입력값과 이동 속력을 사용해 결정
    float xSpeed = xInput * speed;
    float zSpeed = zInput * speed;

    //Vector3 속도를 (xSpeed, 0 , zSpeed)로 생성
    Vector3 newVelocity = new Vector3(xSpeed, 0f, zSpeed);
    //리지드바디의 속도에 newVelocity 할당
    playerRigidbody.velocity = newVelocity;
}

여기서 Input.GetAxis() 메서드가 등장하는데, 이는 어떤 **축에 대한 입력값을 숫자로 변환하는 메서드**이다.

>✍ **Horizontal 축**의 경우
	- 음의 방향 : ←(왼쪽 방향키), A 키에 대응되어 -1.0이 출력됨.
    - 양의 방향 : →(오른쪽 방향키), D 키에 대응되어 +1.0이 출력됨.
    - 아무것도 누르지 않을 때는 0이 출력됨.
    
>✍ **Vertical 축**의 경우
	- 음의 방향 : ↓(아래쪽 방향키), S 키에 대응되어 -1.0이 출력됨.
    - 양의 방향 : ↑(위쪽 방향키), W 키에 대응되어 +1,0이 출력됨.
    - 아무것도 누르지 않을 때는 0이 출력됨.
    
이를 입력받아 각각을 speed와 곱하여 X 방향 이동 속도, Z 방향 이동 속도를 표현하여 조작감을 개선하였다.

이러한 점을 개선하여 2차 스크립트를 완성하였다.

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private Rigidbody playerRigidbody; //이동에 사용할 리저드바디 컴포넌트
    public float speed = 8f; //이동 속력

    void Start()
    {
        //게임 오브젝트에서 Rigidbody 컴포넌트를 찾아 playerRigidbody에 할당
        playerRigidbody = GetComponent<Rigidbody>();
    }

    void Update()
    {
        //수평축과 수직축의 입력값을 감지하여 저장
        float xInput = Input.GetAxis("Horizontal");
        float zInput = Input.GetAxis("Vertical");

        //실제 이동 속도를 입력값과 이동 속력을 사용해 결정
        float xSpeed = xInput * speed;
        float zSpeed = zInput * speed;

        //Vector3 속도를 (xSpeed, 0 , zSpeed)로 생성
        Vector3 newVelocity = new Vector3(xSpeed, 0f, zSpeed);
        //리지드바디의 속도에 newVelocity 할당
        playerRigidbody.velocity = newVelocity;
    }
    
    public void Die() //게임 오브젝트 비활성화
    {
        gameObject.SetActive(false);
    }
}
上記のコードを実行するときのプレゼンテーションビデオです.
#2回目の操作確認


突然加速する現象は,以前の1回目のプレゼンテーションビデオに比べて減少し,方向操作がより即時であることがわかる.p>

まず今週は操作感を改善する方法を見つけて修正し、来週からはゲームオブジェクトを追加するなどの作業でゲームを完成させます.