所以,我对 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();
}
}
还有我的统一层次结构:
我尝试过切换它们,一次是动画师工作,另一次是缩放,但从来没有两者都工作。 我检查了脚本执行顺序,缩放是在动画之后。 它具有所有正确的标签,它没有任何碰撞器(以前有,但这不是问题)。 我还在周围添加了调试器,它说它在所有步骤上对其进行缩放,但我没有看到任何差异(不,该对象足够大,可以在移动时看到明显的差异)。
如有任何帮助,我们将不胜感激!!
就像您已经发现的那样,子游戏对象上有 Rigidbody2D,因此只有子游戏对象会移动。您说您已经尝试将运动脚本和 Rigidbody2D 放到父级上。那应该有效。尝试确保...
另外,为了学习目的,顺便说一下:
如果您想确保您的 ScalingCamera 脚本具有 SpriteRenderer (不过,我认为在这种情况下你不应该这样做,因为你不需要 SpriteRenderer 来使逻辑工作),你可以添加属性 [RequireComponent(typeof(SpriteRenderer))] 在类名上方, 像这样:
[RequireComponent(typeof(SpriteRenderer))]
public class ScalingCamera : MonoBehaviour
更新动画器本身后不必进行缩放。所以你不需要使用 LateUpdate ,可以使用常规的 Update 方法来代替。
更改 SpriteRenderer.size 对于常规精灵没有任何作用。仅当精灵具有平铺或切片绘制模式时,它才会影响精灵。所以你可以删除该代码。
您似乎完全在 UI 中创建游戏。这不是一个好的做法。现在不用担心,但在你的下一场比赛中要记住一些事情:)