Unity 2D:在具有动画的游戏对象上按 Y 缩放

问题描述 投票:0回答:1

所以,我对 Unity 还很陌生,并且有一个问题。我有一个具有运动/动画脚本的游戏对象,我希望角色在 Pos Y 上移动时变小。我尝试使用父/子配置,其中缩放脚本位于父级和精灵渲染器、动画器上、刚体、运动,基本上其他的都在孩子身上。它使其具有动画效果,但无法缩放,我该如何解决这个问题?

这是我的脚本:

缩放播放器:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ScalingCamera : MonoBehaviour
{
    // Start is called before the first frame update
    public float minY = 290f;
    public float maxY = 320f;
    public float minScale = 0.5f;
    public float maxScale = 2.0f;

    private Transform childTransform;
    private SpriteRenderer childSpriteRenderer;

    private void Start()
    {
        childTransform = transform.GetChild(0);

        // Check if the child exists
        if (childTransform != null)
        {
            // Check if the child has a SpriteRenderer component
            childSpriteRenderer = childTransform.GetComponent<SpriteRenderer>();

            if (childSpriteRenderer == null)
            {
                Debug.LogError("Child does not have a SpriteRenderer component.");
            }
        }
        else
        {
            Debug.LogError("No child found for scaling.");
        }
    }

    private void LateUpdate()
    {
        // Get the Y position of the character
        float yPos = transform.position.y;

        // Clamp the Y position within the specified range
        yPos = Mathf.Clamp(yPos, minY, maxY);

        // Calculate the scale based on the clamped Y position
        float scale = Mathf.Lerp(minScale, maxScale, Mathf.InverseLerp(minY, maxY, yPos));

        // Apply the scale to the child GameObject
        childTransform.localScale = new Vector3(scale, scale, 1f);


        // Optionally, apply the scale to the child's SpriteRenderer
        if (childSpriteRenderer != null)
        {
            childSpriteRenderer.size = new Vector2(childSpriteRenderer.size.x * scale, childSpriteRenderer.size.y * scale);

        }
    }
}

玩家的移动/动画

using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.SceneManagement;

[DebuggerDisplay("{" + nameof(GetDebuggerDisplay) + "(),nq}")]
public class movement : MonoBehaviour
{
    [SerializeField] private int speed = 50;
    private Vector2 move;
    [SerializeField] private Animator animator;
    private Rigidbody2D rb;
    private void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();

    }
    private void OnMovement(InputValue value)
    {

        move = value.Get<Vector2>();
        if (move.x != 0 || move.y != 0)
        {
            animator.SetFloat("X", move.x);
            animator.SetFloat("Y", move.y);

            animator.SetBool("IsWalking", true);

        }
        else
            animator.SetBool("IsWalking", false);
    }
    private void FixedUpdate()
    {
        rb.MovePosition(rb.position + move * speed * Time.fixedDeltaTime);
    }

    private string GetDebuggerDisplay()
    {
        return ToString();
    }
}

还有我的统一层次结构:

Unity Editor

我尝试过切换它们,一次是动画师工作,另一次是缩放,但从来没有两者都工作。 我检查了脚本执行顺序,缩放是在动画之后。 它具有所有正确的标签,它没有任何碰撞器(以前有,但这不是问题)。 我还在周围添加了调试器,它说它在所有步骤上对其进行缩放,但我没有看到任何差异(不,该对象足够大,可以在移动时看到明显的差异)。

如有任何帮助,我们将不胜感激!!

unity-game-engine animation scaling 2d-games
1个回答
0
投票

就像您已经发现的那样,子游戏对象上有 Rigidbody2D,因此只有子游戏对象会移动。您说您已经尝试将运动脚本和 Rigidbody2D 放到父级上。那应该有效。尝试确保...

  1. 您的 ScalingCamera 脚本正在更改父级的 localScale(而不是子级的 localScale,就像您现在所做的那样)。因此,您可以完全删除 childTransform 和 childSpriteRenderer 变量,并且可以仅使用变换(您不需要 SpriteRenderer)。
  2. 您在运动脚本中正确引用了动画器。我会将所有组件从您的子对象移动到父对象(这样您就不再有子对象)。然后,您不必更改运动脚本中的任何内容,因为在运动脚本中,您引用的动画器与运动脚本位于完全相同的游戏对象上。

另外,为了学习目的,顺便说一下:

  1. 如果您想确保您的 ScalingCamera 脚本具有 SpriteRenderer (不过,我认为在这种情况下你不应该这样做,因为你不需要 SpriteRenderer 来使逻辑工作),你可以添加属性 [RequireComponent(typeof(SpriteRenderer))] 在类名上方, 像这样:

    [RequireComponent(typeof(SpriteRenderer))]
    public class ScalingCamera : MonoBehaviour 
    
  2. 更新动画器本身后不必进行缩放。所以你不需要使用 LateUpdate ,可以使用常规的 Update 方法来代替。

  3. 更改 SpriteRenderer.size 对于常规精灵没有任何作用。仅当精灵具有平铺或切片绘制模式时,它才会影响精灵。所以你可以删除该代码。

  4. 您似乎完全在 UI 中创建游戏。这不是一个好的做法。现在不用担心,但在你的下一场比赛中要记住一些事情:)

© www.soinside.com 2019 - 2024. All rights reserved.