스프라이트 이동, 회전, 크기 조정
검증 환경
- 윈도우
-
- 윈도우 11
- 유니티 에디터
-
- 2020.3.25에프1
- 입력 시스템 패키지
-
- 1.2.0
이 팁의 전제 조건
다음 설정은 이러한 팁을 설명하기 위한 전제 조건으로 미리 구성되어 있습니다.
스프라이트 이동
게임에서는 컨트롤러를 사용하여 캐릭터를 움직이는 경우가 많습니다. 이번에는 키보드를 사용하여 화면에 표시되는 스프라이트를 이동하고 싶습니다.
스크립트를 변경하면 키보드 외에 게임 패드로 이동할 수 있습니다. 각 입력은 입력 시스템에 대한 팁에 정리되어 있으므로 참고하시기 바랍니다.
스프라이트 배치(Sprite Placement)
뷰에 스프라이트 하나를 배치합니다. 스프라이트 배치에 대한 지침은 이전 팁을 참조하십시오. 당분간, 이미지의 유형과 크기는 뷰에 표시되는 한 무엇이든 될 수 있습니다.
조작 설명의 텍스트도 있지만, 이 조작에는 영향을 주지 않습니다.
키보드로 스프라이트를 이동할 수 있는 스크립트 만들기
입력 작업으로 스프라이트를 이동하기 위해서는 스크립트를 생성해야 하므로 프로젝트에서 스크립트를 생성해야 합니다.
이름은 임의적이지만 이 경우에는 SpriteMove
입니다.
스크립트를 만들고 연 후 다음을 입력합니다. 이 스크립트는 이동할 스프라이트에 부착된다는 가정을 기반으로 합니다.
using UnityEngine;
using UnityEngine.InputSystem; // 追加
public class SpriteMove : MonoBehaviour
{
// 一定時間ごとに呼ばれます
void FixedUpdate()
{
// キーボードの情報を取得
var keyboard = Keyboard.current;
if (keyboard == null)
{
Debug.Log("キーボードがありません。");
return;
}
// スプライトの移動処理
// Translate メソッドでスプライトの位置が移動します
// Space.World を指定すると回転の影響をうけません
if (keyboard.leftArrowKey.isPressed)
{
transform.Translate(-0.1f, 0, 0, Space.World);
}
if (keyboard.rightArrowKey.isPressed)
{
transform.Translate(0.1f, 0, 0, Space.World);
}
if (keyboard.upArrowKey.isPressed)
{
transform.Translate(0, 0.1f, 0, Space.World);
}
if (keyboard.downArrowKey.isPressed)
{
transform.Translate(0, -0.1f, 0, Space.World);
}
// スプライトの回転処理
// Rotate メソッドでスプライトが回転します
if (keyboard.spaceKey.isPressed)
{
transform.Rotate(0, 0, 5f);
}
// スプライトの拡大縮小
// メソッドはないので localScale プロパティに倍率をかけます
if (keyboard.aKey.isPressed)
{
transform.localScale *= 1.02f;
}
if (keyboard.zKey.isPressed)
{
transform.localScale /= 1.02f;
}
}
}
스프라이트를 정기적으로 이동시키 Update
려면 메서드에서 프로세스를 설명해야 합니다.
FixedUpdate
이 경우 거기에서 만들고 설명했습니다.
자세한 내용은 다음에 자세히 설명하겠지만Update
초당 메서드가 호출되는 횟수는 메서드가 실행되는 환경에 따라 달라집니다.
따라서, 실행 환경에 따라 이동 속도가 달라질 수 있습니다.
FixedUpdate
초당 메서드가 호출되는 횟수는 설정 값에 의해 결정되므로 어떤 환경에서도 동일한 속도로 스프라이트를 이동할 수 있습니다.
public class SpriteMove : MonoBehaviour
{
// 一定時間ごとに呼ばれます
void FixedUpdate()
{
// :
}
}
이번에는 키보드로 조작하는 것을 전제로 하기 때문에, Keyboard.current
키보드 정보는 로 취득한다.
여기에서 코드를 변경하면 마우스나 게임패드로도 가져올 수 있습니다.
변경을 원하시면 다음 팁을 참고하시기 바랍니다.
// キーボードの情報を取得
var keyboard = Keyboard.current;
if (keyboard == null)
{
Debug.Log("キーボードがありません。");
return;
}
SpriteMove
상속하는 클래스에는 연결할 개체 MonoBehaviour
에 대한 정보가 들어 있습니다.
transform
예를 들어, 속성에 액세스할 때 개체의 위치를 조작할 수 있습니다.
Transform.Translate
메서드를 호출하여 개체의 위치를 현재 위치에서 이동할 수 있습니다.
X 및 Y 좌표는 각각 커서 키에 따라 이동합니다.
Space.World
를 사용하면 아래에 설명된 회전의 영향을 받지 않고 이동할 수 있습니다.
// スプライトの移動処理
// Translate メソッドでスプライトの位置が移動します
// Space.World を指定すると回転の影響をうけません
if (keyboard.leftArrowKey.isPressed)
{
transform.Translate(-0.1f, 0, 0, Space.World);
}
if (keyboard.rightArrowKey.isPressed)
{
transform.Translate(0.1f, 0, 0, Space.World);
}
if (keyboard.upArrowKey.isPressed)
{
transform.Translate(0, 0.1f, 0, Space.World);
}
if (keyboard.downArrowKey.isPressed)
{
transform.Translate(0, -0.1f, 0, Space.World);
}
Transform.Rotate
메서드를 호출하여 개체를 현재 상태에서 회전할 수 있습니다.
인수는 지정된 축에 대한 회전량입니다. X축은 좌우축, Y축은 상하축, Z축은 거꾸로 가는 축입니다.
따라서 2D에서 Z축을 기준으로 회전을 곱하면 시계 방향과 시계 반대 방향으로 회전합니다.
// スプライトの回転処理
// Rotate メソッドでスプライトが回転します
if (keyboard.spaceKey.isPressed)
{
transform.Rotate(0, 0, 5f);
}
그건 그렇고, 나는 이전에 Translate
메소드에서 Space.World
지정했지만,
지정하지 않으면 회전 방향에 따라 이동 방향이 회전합니다.
예를 들어, 아래 그림 Space.World
에서 가 지정되고 45° 회전으로 오른쪽 이동 조작이 수행됩니다.
다음 그림 Space.World
에서는 를 지정하지 않고 45° 회전하여 오른쪽 이동 작업을 수행합니다.
Space.World
이 방법으로 지정하지 않으면 회전 방향에 따라 이동 방향이 변경됩니다.
이는 3D 및 무선 제어 작업을 구현하는 데 유용합니다.
축척의 경우 현재 축척을 기준으로 축척을 늘리거나 줄일 수 있는 방법이 없습니다.
localScale
속성에 대한 계산을 수행합니다.
단순히 현재 값에 배율을 곱하면 키 누름에 따라 크기를 조정할 수 있습니다.
Vector2
로 설정하면 X 방향만 확대, Y 방향만 확대 등을 할 수 있습니다.
// スプライトの拡大縮小
// メソッドはないので localScale プロパティに倍率をかけます
if (keyboard.aKey.isPressed)
{
transform.localScale *= 1.02f;
}
if (keyboard.zKey.isPressed)
{
transform.localScale /= 1.02f;
}
스크립트를 저장했으면 스프라이트에 연결합니다. 계층 구조에서 스프라이트의 이름은 파일 이름과 같으므로 필요한 경우 이해하기 쉽도록 변경합니다.
그런 다음 게임을 실행하고 키보드에서 작동하는지 확인하십시오.
수직 또는 수평 슈팅 게임에서 배를 움직이기에 충분하다고 생각합니다. 물론 적의 움직임을 자동으로 계산하면 같은 코드로 움직일 수 있습니다.