Hoạt hình các bộ phận

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Người chơi có thể nhận phản hồi về việc hành động của họ có làm bất cứ điều gì với hoạt hình hay không.Đây có thể là một cây rung chuyển khi bị đánh, hoặc một thú cưng vui vẻ nhảy lên khi được cho ăn.Trong trường hợp này, chúng tôi sẽ cho bạn thấy cách tạo một nút di chuyển khi người chơi nhấp vào nó.

Tween với hoạt hình

Một cách để hoạt hình các đối tượng là sử dụng thiếu niên.A tween , ngắn cho giữa, là quá trình thay đổi một giá trị khởi đầu thành một giá trị kết thúc trong một khoảng thời gian nhất định.Thiếu niên có thể được sử dụng để thay đổi các thuộc tính như vị trí, màu sắc hoặc xoay.

Cài đặt dự án

Đối với dự án này, một thiếu niên sẽ di chuyển một đối tượng từ vị trí bắt đầu sang vị trí mục tiêu.

  1. Xác định phần nào bạn sẽ hoạt hình. Trong ví dụ dưới đây, 1 là nút và 2 là bức tường.

  2. Trong phần sẽ di chuyển, thêm một ClickDetector và một kịch bản có tên TweenMove. Không đổi tên ClickDetector.

  3. Mở kịch bản TweenMove. Sau đó, sao chép và dán kịch bản dưới đây.


    -- Thiếu niên một phần lại lại dựa trên một trục được chọn
    -- Nút có trạng thái bật/tắt di chuyển phần tiến lên hoặc lùi xuống
    local TweenService = game:GetService("TweenService")
    local button = script.Parent
    local clickDetector = button:FindFirstChildWhichIsA("ClickDetector")
    local buttonState = -1 -- Xác định hướng nút; -1 có nghĩa là nó sẽ được ấn vào, 1 có nghĩa là nó sẽ nhô ra
    local inTween = false
    -- Biến có thể tùy chỉnh
    local TWEEN_TIME = 0.15
    local TWEEN_MOVE_DISTANCE = 1.5
    -- Biến thiếu niên
    local buttonTweenInfo = TweenInfo.new(
    TWEEN_TIME, -- Thời gian
    Enum.EasingStyle.Quad, -- Kiểu dễ dàng
    Enum.EasingDirection.Out -- Hướng dễ dàng
    )
    local function buttonPress()
    -- Nếu nút đang chuyển đổi, ngăn chặn nó được sử dụng lại
    if inTween == true then
    return
    end
    -- Tính toán CFrame mới cho vị trí nút
    local offsetCFrame = CFrame.new(0, TWEEN_MOVE_DISTANCE * buttonState, 0)
    local newCFrame = button.CFrame:ToWorldSpace(offsetCFrame)
    -- Tạo một tween và chơi nó
    local tweenButton = TweenService:Create(button, buttonTweenInfo, {CFrame = newCFrame})
    tweenButton:Play()
    inTween = true
    -- Khi hoàn thành tween, làm cho nút có thể sử dụng trở lại
    tweenButton.Completed:Connect(function()
    inTween = false
    -- Đảo ngược trạng thái nút
    buttonState *= -1
    end)
    end
    clickDetector.MouseClick:Connect(buttonPress)
  4. Thử nghiệm và nhấp vào đối tượng.Trong khi kiểm tra, bạn có thể nhận thấy đối tượng di chuyển sai hướng hoặc khoảng cách.Điều đó có thể được tùy chỉnh trong phần tiếp theo.

Hướng sai; cần điều chỉnh
Di chuyển đúng; không cần điều chỉnh

Chỉnh sửa tween di chuyển

Với kịch bản được thêm, bạn có thể tùy chỉnh nó để phù hợp với nhu cầu của trò chơi của bạn.Nút có thể được di chuyển theo các hướng như trước và quay lại, hoặc lên và xuống.

Thay đổi vị trí

Hãy nhớ, thiếu niên chuyển từ một giá trị khởi đầu sang một giá trị mục tiêu.Các kịch bản này sử dụng CFrames để di chuyển nút theo hướng tương quan với vị trí hiện tại của nó.Hướng đó được kiểm soát trong Dòng 28 của kịch bản.

Trên đường này, một khung mới được tạo bằng cách sử dụng X, Y và Z điểm. Trong ví dụ này, nút di chuyển theo trục Y của nó.


-- Tính toán CFrame mới cho vị trí nút
local offsetCFrame = CFrame.new(0, TWEEN_MOVE_DISTANCE * buttonState, 0)
local newCFrame = button.CFrame:ToWorldSpace(offsetCFrame)

Để có nút di chuyển theo hướng khác trong , chỉ cần thay thế một trong những điểm định vị mong muốn bằng dòng: TWEEN_MOVE_DISTANCE * buttonState.Đặt tất cả các điểm còn lại thành 0.

Ví dụ, dòng này sẽ di chuyển nó theo trục X của nó thay vào đó.


-- Tính toán CFrame mới cho vị trí nút
local offsetCFrame = CFrame.new( TWEEN_MOVE_DISTANCE * buttonState, 0, 0)
local newCFrame = button.CFrame:ToWorldSpace(offsetCFrame)

Thời gian và khoảng cách Tween

Tập lệnh bao gồm các biến sau ảnh hưởng đến chuyển động của tween.Các tên có chữ hoa như TWEEN_TIME được viết riêng cho kịch bản này được sửa đổi.

Thử thay đổi giá trị của một biến dưới đây:

  • Dòng 11 - TWEEN_TIME : Thời gian bằng giây mà một thiếu niên xảy ra.
  • Dòng 12 - TWEEN_MOVE_DISTANCE : Khoảng cách mà nút di chuyển trong đinh tán.

Tween các thuộc tính khác

Hầu hết các thuộc tính có loại dữ liệu số có thể được chia nhỏ.Phần này bao gồm một số tính năng chung, như quay, có thể được sử dụng để mang thêm phản hồi của người chơi vào trò chơi của bạn.Hãy nhớ rằng, bạn cũng có thể tween nhiều thuộc tính cùng một lúc.

Đối với một danh sách đầy đủ các thuộc tính, xem trang TweenService.

Xoay

Đối với việc xoay, kết hợp tweening và CFrames thay vì chỉ sử dụng Vector3.Thiếu niên xoay có thể được sử dụng để làm cho sinh vật chuyển động khi thú cưng, hoặc xoay tiền xu khi nó được nhặt lên.

Trong ví dụ kịch bản tiếp theo, vị trí và độ xoay của sinh vật được tween khi nhấp để hiển thị nó hạnh phúc như thế nào khi được vuốt ve.

Mã bên dưới sẽ xoay một đối tượng dựa trên số độ trong TWEEN_ROT_ANGLES .


-- Sử dụng tween để làm cho đối tượng xoay lên và bật lên
local TweenService = game:GetService("TweenService")
local partToTween = script.Parent
local clickDetector = partToTween:FindFirstChildWhichIsA("ClickDetector")
local inTween = false
-- Biến có thể tùy chỉnh
local TWEEN_TIME = 0.25
local TWEEN_ROT_ANGLES = -45
local TWEEN_MOVE_DISTANCE = 3
-- Biến thiếu niên
local tweenInfo = TweenInfo.new(
TWEEN_TIME, -- Thời gian
Enum.EasingStyle.Quad, -- Kiểu dễ dàng
Enum.EasingDirection.Out, -- Hướng dễ dàng
1, -- RepeatCount (khi ít hơn không có tween sẽ lặp vô cực)
true -- Lật ngược (tween sẽ lật ngược một khi đạt được mục tiêu)
)
local function activateAction()
-- Nếu đối tượng đang tweening, ngăn nó tweening lần nữa
if inTween == true then
return
end
-- Tính toán CFrame mới cho vị trí và xoay của đối tượng
local offsetCFrame = CFrame.new(0, TWEEN_MOVE_DISTANCE, 0)
local rotatedCFrame = CFrame.Angles(math.rad(TWEEN_ROT_ANGLES), 0, 0)
offsetCFrame = offsetCFrame:ToWorldSpace(rotatedCFrame)
local newCFrame = partToTween.CFrame:ToWorldSpace(offsetCFrame)
-- Tạo một tween và chơi nó
local tweenObject = TweenService:Create(partToTween, tweenInfo, {CFrame = newCFrame})
tweenObject:Play()
inTween = true
-- Khi hoàn thành tween, làm cho đối tượng lại có thể nhấp vào được
tweenObject.Completed:Connect(function()
inTween = false
end)
end
clickDetector.MouseClick:Connect(activateAction)

Thước đo

Thay đổi kích cỡ của các đối tượng trong trò chơi cũng có thể cho thấy rằng một người chơi đã tương tác với chúng.Ví ví dụ / trường hợp, các lấy như gói sức khỏe hoặc đá quý có thể thu nhỏ khi chạm vào.Để mở rộng các bộ phận, thay đổi mục tiêu tween thành Vector3 mới của kích thước mong muốn.


-- Chuyển qua quy mô của một phần khi nó được chạm vào, sau đó phá hủy nó
local TweenService = game:GetService("TweenService")
local partToScale = script.Parent
local inTween = false
-- Biến có thể tùy chỉnh
local TWEEN_TIME = 1
local TWEEN_SCALE = Vector3.zero
-- Biến thiếu niên
local tweenInfo = TweenInfo.new(
TWEEN_TIME, -- Thời gian
Enum.EasingStyle.Exponential, -- Kiểu dễ dàng
Enum.EasingDirection.Out -- Hướng dễ dàng
)
local function onPartTouch(otherPart)
-- Nếu đối tượng đang tweening, ngăn nó tweening lần nữa
if inTween == true then
return
end
local partParent = otherPart.Parent
local humanoid = partParent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- Ngăn chặn các va chạm tiếp theo trên đối tượng vì nó đã được nhặt lên
partToScale.CanCollide = false
-- Tạo một tween và chơi nó
local tweenObject = TweenService:Create(partToScale, tweenInfo, {Size = TWEEN_SCALE})
tweenObject:Play()
inTween = true
-- Khi hoàn thành tween, phá hủy đối tượng
tweenObject.Completed:Connect(function()
partToScale:Destroy()
end)
end
end
partToScale.Touched:Connect(onPartTouch)

Thay đổi màu

Các bộ phận có thể chuyển đổi màu bằng cách tweening với giá trị Color3.Ví ví dụ / trường hợp, kẻ thù hoặc các đối tượng có thể phá hủy có thể chiếu màu để cung cấp phản hồi rằng chúng đã bị đánh hoặc nhấp vào.


-- Chuyển màu của một đối tượng khi nhấp và phá hủy nó sau 3 lần nhấp
local TweenService = game:GetService("TweenService")
local partToTween = script.Parent
local clickDetector = partToTween:FindFirstChildWhichIsA("ClickDetector")
local inTween = false
-- Biến có thể tùy chỉnh
local TWEEN_TIME = 0.2
local COLOR_ON_HIT = Color3.fromRGB(255, 0, 50)
local hitCount = 0
-- Biến thiếu niên
local tweenInfo = TweenInfo.new(
TWEEN_TIME, -- Thời gian
Enum.EasingStyle.Exponential, -- Kiểu dễ dàng
Enum.EasingDirection.InOut, -- Hướng dễ dàng
0, -- RepeatCount (khi ít hơn không có tween sẽ lặp vô cực)
true -- Lật ngược (tween sẽ lật ngược một khi đạt được mục tiêu)
)
local function activateAction()
-- Nếu đối tượng đang tweening, ngăn nó tweening lần nữa
if inTween == true then
return
end
-- Tạo một tween và chơi nó
local tweenObject = TweenService:Create(partToTween, tweenInfo, {Color = COLOR_ON_HIT})
tweenObject:Play()
inTween = true
-- Khi hoàn thành tween, làm cho đối tượng lại có thể nhấp vào được
tweenObject.Completed:Connect(function()
inTween = false
-- Tăng số lần truy cập hit
hitCount += 1
-- Sau 3 lần đánh, phá hủy đối tượng
if hitCount == 3 then
partToTween:Destroy()
end
end)
end
clickDetector.MouseClick:Connect(activateAction)

Trong khi kịch bản này sử dụng một phần bình thường để thay đổi màu, cũng có thể sử dụng nó trên MeshParts với một kết cấu được áp dụng.Các MeshParts thường nhập mô hình 3D, thay vì các bộ phận được xây dựng trực tiếp trong Roblox Studio.

Nếu bạn đang làm việc với một MeshPart hoàn toàn có kết cấu, chúng tôi khuyên bạn nên làm theo theo dõi:

  1. Sử dụng một SpecialMesh thay vì một MeshPart. Điều này là do kết cấu của một MeshPart làm hỏng màu được tông màu bởi kịch bản.

  2. Thay đổi kịch bản để thay đổi VertexColor của SpecialMesh thay vì tính chất Color.

Ví dụ dự án

Xem tất cả các ví dụ mã trong địa điểmkhông bị khóa sao chép này. Nhận tất cả các mã để chỉnh sửa cũng như vậy.

Bao gồm các kịch bản cho việc xoay, thay đổi kích thước và thay đổi màu cho thiếu niên.