Resultados 1 al 2 de 2

Tema: Error de movimiento en mi código para Unity

  1. #1
    Fecha de ingreso
    Dec 2023
    Mensajes
    2
    Gracias (Dadas)
    1
    Gracias (Recibidas)
    0

    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;
    }
    }


  2. #2
    Fecha de ingreso
    Aug 2004
    Mensajes
    22,400
    Gracias (Dadas)
    707
    Gracias (Recibidas)
    7251
    Esto tendrías que probarlo en chatGPT
    Los códigos lo genera y los rectifica bastante bien.

    https://chat.openai.com/

  3. Gracias sabionbot10 Agradece este post

Temas similares

  1. 3ds Max Error al ejecutar Script Unity
    Por lukas en el foro Problemas con Programas
    Respuestas: 3
    : 22-03-2022, 17:22
  2. Error al exportar mi animación a Unity
    Por Heyoz en el foro Animación y Rigging
    Respuestas: 1
    : 31-10-2017, 23:37
  3. Cómo usar movimiento de Realviz para capturar movimiento
    Por masticas en el foro Animación y Rigging
    Respuestas: 5
    : 01-02-2017, 18:48
  4. Respuestas: 0
    : 30-05-2010, 04:10
  5. Maya Error,Maya todo con código binario
    Por nuevometropolis en el foro Problemas con Programas
    Respuestas: 3
    : 09-03-2010, 23:03

Etiquetas para este tema