-
Error de movimiento en mi código para Unity
Hola, estoy continuando un trabajo sobre un juego Pokémon, y cuando estaba mejorando el código en Unity, me apareció este error:
"You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed. MonoBehaviours can only be added using AddComponent(). Alternatively, your script can inherit from ScriptableObject or no base class at all."
UnityEngine.MonoBehaviour:.ctor ()
SpriteAnimator:.ctor (System.Collections.Generic.List`1<UnityEngine.Spr ite>, UnityEngine.SpriteRenderer, float) (at Assets/Scripts/Utils/SpriteAnimator.cs:14)
CharacterAnimatortart () (at Assets/Scripts/CharacterAnimator.cs:36)
Este es mi código:
Character:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Character : MonoBehaviour
{
public float moveSpeed;
CharacterAnimator animator;
private void Awake()
{
animator = GetComponent<CharacterAnimator>();
}
public IEnumerator Move(Vector2 moveVec)
{
animator.MoveX = moveVec.x;
animator.MoveY = moveVec.y;
var targetPos = transform.position;
targetPos.x += moveVec.x;
targetPos.y += moveVec.y;
if(IsWalkable(targetPos))
yield break;
animator.IsMoving = true;
while ((targetPos - transform.position).sqrMagnitude > Mathf.Epsilon)
{
transform.position = Vector3.MoveTowards(transform.position, targetPos, moveSpeed * Time.deltaTime);
yield return null;
}
transform.position = targetPos;
animator.IsMoving = false;
}
private bool IsWalkable(Vector3 targetPos)
{
if(Physics2D.OverlapCircle(targetPos, 0.01f, GameLayers.i.SolidLayer | GameLayers.i.InteractableLayer) != null)
{
return false;
}
return true;
}
public CharacterAnimator Animator
{
get => animator;
}
}
PlayerScript:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerScript : MonoBehaviour
{
private Vector2 input;
private Character character;
public VectorValue startingPosition;
private void Awake()
{
character = GetComponent<Character>();
}
private void Start()
{
transform.position = startingPosition.initialValue;
}
public void HandleUpdate()
{
if (!character.Animator.IsMoving)
{
input.x = Input.GetAxisRaw("Horizontal");
input.y = Input.GetAxisRaw("Vertical");
if (input.x != 0) input.y = 0;
if (input != Vector2.zero)
{
StartCoroutine(character.Move(input));
}
}
if (Input.GetKeyDown(KeyCode.E))
Interact();
}
private void Interact()
{
var facingDir = new Vector3(character.Animator.MoveX, character.Animator.MoveY);
var interactPos = transform.position + facingDir;
Debug.DrawLine(transform.position, interactPos, Color.green, 1f);
var collider = Physics2D.OverlapCircle(interactPos, 0.3f, GameLayers.i.InteractableLayer);
if(collider != null)
{
collider.GetComponent<Interactable>()?.Interact();
}
}
}
CharacterAnimator:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CharacterAnimator : MonoBehaviour
{
[SerializeField] List<Sprite> walkDownSprites;
[SerializeField] List<Sprite> walkUpSprites;
[SerializeField] List<Sprite> walkRightSprites;
[SerializeField] List<Sprite> walkLeftSprites;
//parameters
public float MoveX {get; set; }
public float MoveY {get; set; }
public bool IsMoving {get; set; }
//states
SpriteAnimator walkDownAnim;
SpriteAnimator walkUpAnim;
SpriteAnimator walkRightAnim;
SpriteAnimator walkLeftAnim;
SpriteAnimator currentAnim;
bool wasPreviouslyMoving;
SpriteRenderer spriteRenderer;
private void Start()
{
spriteRenderer = GetComponent<SpriteRenderer>();
walkDownAnim = new SpriteAnimator(walkDownSprites, spriteRenderer);
walkUpAnim = new SpriteAnimator(walkUpSprites, spriteRenderer);
walkRightAnim = new SpriteAnimator(walkRightSprites, spriteRenderer);
walkLeftAnim = new SpriteAnimator(walkLeftSprites, spriteRenderer);
currentAnim = walkDownAnim;
}
private void Update()
{
var prevAnim = currentAnim;
if(MoveX == 1)
currentAnim = walkRightAnim;
else if(MoveX == -1)
currentAnim = walkLeftAnim;
else if (MoveY == 1)
currentAnim = walkUpAnim;
else if (MoveY == -1)
currentAnim = walkDownAnim;
if(currentAnim != prevAnim || wasPreviouslyMoving != IsMoving )
currentAnim.Start();
if(IsMoving)
currentAnim.HandleUpdate();
else
spriteRenderer.sprite = currentAnim.Frames[0];
wasPreviouslyMoving = IsMoving;
}
}
-
Esto tendrías que probarlo en chatGPT
Los códigos lo genera y los rectifica bastante bien.
https://chat.openai.com/
-
Agradecimientos - 1 Gracias