Di chuyển, xoay và chia tỷ lệ sprites
Môi trường xác minh
- Windows
-
- cửa sổ 11
- Biên tập viên Unity
-
- 2020.3.25f1
- Gói hệ thống đầu vào
-
- 1.2.0
Điều kiện tiên quyết cho mẹo này
Các cài đặt sau đây được cấu hình sẵn làm điều kiện tiên quyết để giải thích các mẹo này.
Di chuyển sprite
Trong các trò chơi, bạn thường sử dụng bộ điều khiển để di chuyển nhân vật của mình. Lần này, tôi muốn sử dụng bàn phím để di chuyển sprite hiển thị trên màn hình.
Nếu bạn thay đổi tập lệnh, bạn có thể di chuyển nó bằng gamepad ngoài bàn phím. Mỗi đầu vào được tóm tắt trong Mẹo cho hệ thống đầu vào, vì vậy vui lòng tham khảo nó.
Vị trí Sprite
Đặt một sprite trong chế độ xem. Để biết hướng dẫn về cách đặt sprite, hãy tham khảo các mẹo trước. Hiện tại, loại và kích thước của hình ảnh có thể là bất cứ thứ gì miễn là nó hiển thị trên chế độ xem.
Ngoài ra còn có một văn bản giải thích hoạt động, nhưng nó không ảnh hưởng đến hoạt động này.
Tạo một tập lệnh cho phép bạn di chuyển sprites bằng bàn phím
Để di chuyển sprite bằng thao tác nhập, bạn cần tạo tập lệnh, vì vậy hãy tạo tập lệnh trong dự án của bạn.
Tên là tùy ý, nhưng trong trường hợp SpriteMove
này , nó là .
Khi bạn đã tạo và mở tập lệnh, hãy nhập thông tin sau: Tập lệnh này dựa trên giả định rằng nó sẽ được gắn vào sprite để di chuyển.
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
di chuyển sprite một cách thường xuyên, bạn cần mô tả quá trình theo một phương thức.
FixedUpdate
Trong trường hợp này, chúng tôi đã tạo và mô tả nó ở đó.
Tôi sẽ giải thích chi tiết chi tiết vào một thời điểm khác, nhưngUpdate
số lần một phương thức được gọi mỗi giây phụ thuộc vào môi trường mà nó đang chạy.
Do đó, tốc độ di chuyển có thể thay đổi tùy thuộc vào môi trường thực hiện.
FixedUpdate
Số lần phương thức được gọi mỗi giây được xác định bởi giá trị cài đặt, vì vậy bạn có thể di chuyển sprite ở cùng tốc độ trong bất kỳ môi trường nào.
public class SpriteMove : MonoBehaviour
{
// 一定時間ごとに呼ばれます
void FixedUpdate()
{
// :
}
}
Vì giả định rằng nó sẽ được vận hành bằng bàn phím lần này, thông Keyboard.current
tin bàn phím được lấy bằng .
Nếu bạn thay đổi mã ở đây, bạn cũng có thể lấy nó bằng chuột hoặc gamepad.
Nếu bạn muốn thay đổi nó, vui lòng tham khảo các mẹo sau.
// キーボードの情報を取得
var keyboard = Keyboard.current;
if (keyboard == null)
{
Debug.Log("キーボードがありません。");
return;
}
SpriteMove
Lớp mà bạn kế thừa chứa thông tin về đối tượng mà bạn MonoBehaviour
đang đính kèm.
transform
Khi bạn truy cập các thuộc tính, bạn có thể thao tác vị trí của đối tượng, ví dụ.
Transform.Translate
Bạn có thể gọi một phương thức để di chuyển vị trí của đối tượng từ vị trí hiện tại của nó.
Tọa độ X và Y được di chuyển theo các phím con trỏ tương ứng.
Space.World
, bạn có thể di chuyển mà không bị ảnh hưởng bởi vòng quay được mô tả bên dưới.
// スプライトの移動処理
// 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
Bạn có thể gọi một phương thức để xoay một đối tượng từ trạng thái hiện tại của nó.
Đối số là lượng quay đối với trục được chỉ định. Trục X là trục trái và phải, trục Y là trục lên và xuống và trục Z là trục đi lùi.
Do đó, trong 2D, nếu bạn nhân vòng quay với trục Z, nó sẽ quay theo chiều kim đồng hồ và ngược chiều kim đồng hồ.
// スプライトの回転処理
// Rotate メソッドでスプライトが回転します
if (keyboard.spaceKey.isPressed)
{
transform.Rotate(0, 0, 5f);
}
Nhân tiện, tôi đã chỉ định trong Space.World
phương thức trước đó Translate
, nhưng
Nếu điều này không được chỉ định, hướng di chuyển sẽ quay theo hướng quay.
Ví dụ, trong hình Space.World
dưới đây, được chỉ định và thao tác chuyển động phù hợp được thực hiện với góc quay 45 °.
Trong hình sau, Space.World
thao tác chuyển động bên phải được thực hiện với góc quay 45 ° mà không chỉ định .
Space.World
Nếu bạn không chỉ định theo cách này, hướng di chuyển thay đổi theo hướng bạn xoay.
Điều này rất hữu ích để thực hiện các hoạt động 3D và điều khiển vô tuyến.
Đối với nhân rộng, không có phương pháp tăng hoặc giảm quy mô so với quy mô hiện tại.
localScale
Thực hiện tính toán trên tài sản.
Nếu bạn chỉ cần nhân giá trị hiện tại với độ phóng đại, bạn có thể chia tỷ lệ nó theo cách nhấn phím.
Vector2
Nếu bạn đặt nó bằng , bạn chỉ có thể phóng to hướng X, chỉ phóng to hướng Y, v.v.
// スプライトの拡大縮小
// メソッドはないので localScale プロパティに倍率をかけます
if (keyboard.aKey.isPressed)
{
transform.localScale *= 1.02f;
}
if (keyboard.zKey.isPressed)
{
transform.localScale /= 1.02f;
}
Khi bạn đã lưu tập lệnh của mình, hãy đính kèm nó vào sprite của bạn. Tên của sprite trong hệ thống phân cấp giống với tên tệp, vì vậy nếu cần, hãy thay đổi nó để dễ hiểu hơn.
Sau đó, chạy trò chơi và xem nó có hoạt động với bàn phím của bạn không.
Tôi nghĩ điều này là đủ để di chuyển con tàu của bạn trong một trò chơi bắn súng dọc hoặc ngang. Tất nhiên, nếu bạn tự động tính toán chuyển động của kẻ thù, bạn có thể di chuyển nó bằng cùng một mã.