#c# #unity3d #game-physics #2d-games
#c# #unity3d #игра-физика #2d-игры
Вопрос:
На самом деле я пытаюсь создать игру, в которой по умолчанию для игрока установлена анимация ожидания, поэтому при срабатывании, когда крючок захватывает драгоценный камень, запускается анимация переноса веревки, но, похоже, я не могу остановить анимацию переноса веревки и вернуться в режим ожидания. Хук также захватывает более одного элемента, кто-нибудь может мне помочь в этом? Вот наглядная иллюстрация анимации
Обмотка веревки — игрок начинает лебедку в драгоценном камне
Вот код для скрипта перехвата:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HookScripts : MonoBehaviour {
[SerializeField]
private Transform itemHolder;
private bool itemAttached;
private HookMovement hookMovement;
private PlayerAnimation playerAnim;
void Awake() {
hookMovement = GetComponentInParent<HookMovement>();
playerAnim = GetComponentInParent<PlayerAnimation>();
}
void OnTriggerEnter2D(Collider2D target) {
if (target.tag == Tags.PINK_GEM || target.tag == Tags.GREEN_GEM || target.tag == Tags.BLUE_GEM
|| target.tag == Tags.ORANGE_GEM || target.tag == Tags.PURPLE_GEM
|| target.tag == Tags.LIGHT_BLUE_GEM || target.tag == Tags.PINK_GEM_SMALL
|| target.tag == Tags.LARGE_STONE || target.tag == Tags.SMALL_STONE){
itemAttached = true;
target.transform.parent = itemHolder;
target.transform.position = itemHolder.position;
// Set the position of the hook to the position of the item
hookMovement.move_Speed = target.GetComponent<ItemScripts>().hook_Speed;
hookMovement.HookAttachedItem();
//animate player
playerAnim.PullingItemAnimation();
if (target.tag == Tags.PINK_GEM || target.tag == Tags.GREEN_GEM || target.tag == Tags.BLUE_GEM
|| target.tag == Tags.ORANGE_GEM || target.tag == Tags.PURPLE_GEM
|| target.tag == Tags.LIGHT_BLUE_GEM || target.tag == Tags.PINK_GEM_SMALL)
{
SoundManager.instance.HookGrab_Jewel();
}
else if (target.tag == Tags.LARGE_STONE || target.tag == Tags.SMALL_STONE){
SoundManager.instance.HookGrab_Stone();
}
SoundManager.instance.WinchCrank(true);
} // If the target is an item
if (target.tag == Tags.DELIVER_ITEM){
if(itemAttached){
itemAttached = false;
Transform objChild = itemHolder.GetChild(0);
objChild.parent = null;
objChild.gameObject.SetActive(false);
playerAnim.IdleAnimation();
SoundManager.instance.WinchCrank(false);
}
}// Remove items after winching
}// On trigger enter
}
А вот код для сценария анимации проигрывателя
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerAnimation : MonoBehaviour
{
private Animator anim;
void Awake()
{
anim = GetComponent<Animator>();
}
public void IdleAnimation()
{
anim.SetTrigger("Idle");
}
public void PullingItemAnimation()
{
anim.SetTrigger("ropeWrap");
}
}
Ответ №1:
Я никогда не был хорош с анимацией в Unity, но я могу помочь с проблемой нескольких элементов. В настоящее время, когда перехват попадает на элемент, все, что вы проверяете, это то, что это за элемент; переменная itemAttached установлена, но на самом деле никогда не используется. Вам нужно добавить некоторую проверку, которая гласит: «Если у меня уже есть элемент, не берите другой. На практике это просто добавило бы и к условию коллекции элементов:
if (!itemAttached amp;amp; (target.tag == Tags.PINK_GEM || target.tag == Tags.GREEN_GEM || target.tag == Tags.BLUE_GEM
|| target.tag == Tags.ORANGE_GEM || target.tag == Tags.PURPLE_GEM
|| target.tag == Tags.LIGHT_BLUE_GEM || target.tag == Tags.PINK_GEM_SMALL
|| target.tag == Tags.LARGE_STONE || target.tag == Tags.SMALL_STONE)){
//attach the item
}
Комментарии:
1. Большое вам спасибо, определенно решил проблему с крючком!