[Unity] 전방으로 날아가는 마법 공격을 실현한다.

Json에 저장된 정보 읽기


하고 싶은 일


・RPG의 주인공이 하는 마법 공격을 실시하고 싶다.
・주인공 앞에 공을 띄우고 앞으로 발사하고 싶다.
・공 출현 후 1초 후 파괴하거나 적과 충돌하여 파괴한다.
・위의 공격 버튼을 누르면 진행을 희망합니다.

사전 준비


1) Asset의 import


import의 Asset은 좋아하는 물건이라 문제없지만, 저는 다음과 같은 Asset을 준비했습니다.
・Player
https://assetstore.unity.com/packages/3d/characters/animals/dog-knight-pbr-polyart-135227
• 발사하고 싶은 prefab
https://assetstore.unity.com/packages/vfx/particles/fire-explosions/fire-spell-effects-36825
<확인사항>
・Project/Assets의 부하들이 DogKnight를 배치했습니다.
• Project/Assets의 부하가 PyroParticles를 구성했습니다.

2) Prefab 구성


· Player 구성
Project>Assets/DogKnight/Prefab/DogPolyart.prefab를Hierarchy에 설정합니다.
공의 배치
a) Project > Assets 아래에 Resources 폴더를 생성합니다.
Assets&Create>Folder&를 마우스 오른쪽 버튼으로 클릭하면 이름이 Resources로 지정됩니다.
b) Project > Assets/Resources 폴더 아래에 "MagicPrefabs"폴더 만들기
c) Project/Assets/PyroParticles/Prefab/Prefab/Meteor.prefab를 "ctrl+D"로 복사합니다.
Meteor 1이 생성된 것 같습니다.
d) Resources/MagicPrefabs 폴더 아래에 "Meteor 1"을 끌어 놓습니다.
e) Meteor 1의 이름을 meteor로 변경합니다.
이 정도면 다음 폴더로 구성될 것 같아요.

3) 애니메이션의 준비


a) Project/Assets 아래에 "Animatior"폴더를 생성합니다.
b) Project/Assets/Animaator 밑에서 Player Animator Controller를 만듭니다.
(Project/Assets/Animaator > Create>Animator Controller 를 마우스 오른쪽 단추로 클릭)
c) PlayerAnimatiorController를 두 번 클릭합니다.
d) Aniamator 화면에서 Assets/DogKnight/Animation 소속 Animation을 드래그합니다.
e) 다음을 구성하십시오.

(이번에 필요한 부분은'Enry','Idle Battle','Attack 01'뿐입니다.
다른 부분은 신경 쓰지 마세요...)
f) "Idle Battle"→"Attack 01"에서 "Attack"triger를 설정합니다.
g) "Idle Battle"← "Attack 01"에 설정된 내용이 없습니다.
이상은 사전 준비의 끝이었다.
그럼 우리 인코딩합시다!!

소스 코드


지금부터 예비 조립의 생성, 발사, 파괴를 인코딩하기 시작합니다.
생성할 세 개의 원본 파일입니다.

PlayerManager.cs


는 Player에 첨부된 원본 파일입니다.
왼쪽 클릭이 감지되면 IdelBattle에서 Attack01로 마이그레이션합니다.
using UnityEngine;
using UnityEngine.Animations;

public class PlayerManager : MonoBehaviour
{
    Animator animator;                  // PlayerのAniamtor
    Rigidbody rb;                       // PlayerのRigidbody

    void Start()
    {
        animator = GetComponent<Animator>();    // PlayerのAnimatorを取得
    }
    
    void Update()
    {
        playerAttack();
    }
    
    private void playerAttack()
    {
        if (Input.GetButtonDown("Fire1"))    //左クリックされたら
        {
            animator.SetTrigger("Attack");   // 「Attack」Triggerをonにする
        }
    }

PlayerAttBehaviour.cs


Animation Clip에 포함된 Attack01의 소스 파일입니다.
본 원본 파일은 일반 제작 방법과 달리 다음과 같은 방법으로 제작한다.
"Attack01"> Add Bhaviour New Scripts > 를 클릭하여 "Player AttBehaviour"를 입력하십시오.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerAttBehaviour : StateMachineBehaviour
{
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        // 生成したいプレハブをResources/MagicPrefabs配下のプレハブを指定する。
        GameObject shotObject = (GameObject)Resources.Load("MagicPrefabs/Meteor");

        // プレハブの生成場所を指定する。(今回はPlayerのポジションを指定)
        Vector3 playerPos = animator.GetComponent<Transform>().position;

        // プレハブの生成
        GameObject shot = Instantiate(shotObject, playerPos, Quaternion.identity);

        // キャラクターオブジェクトを取得
        GameObject playerGameObj = animator.GetComponent<PlayerManager>().gameObject;

        // PlayerMagicAtt.csのSetObject()を呼び出し
        shot.GetComponent<PlayerMagicAtt>().SetObject(playerGameObj, shot);
    }

PlayerMagicAtt.cs


Resources/MagicPrefabs/Meteor 프리셋 허브에 첨부된 소스 파일입니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMagicAtt : MonoBehaviour
{
    public float shot_speed = 1000;
    protected Vector3 forward;
    protected Rigidbody rb;
    protected GameObject characterObject;
    private GameObject attPrefab;

    void Start()
    {
        rb = this.GetComponent<Rigidbody>();            // プレハブのRigidbodyを取得
        forward = characterObject.transform.forward;    // Playerの前方を取得
        Destroy(this.attPrefab, 1f);                    // プレハブを1秒後破壊
    }

    void Update()
    {
        rb.velocity = forward * shot_speed;        // プレハブを移動させる
    }

    void OnCollisionEnter(Collision collision)
    {
        // 敵に衝突したら、プレハブを破壊
        if (collision.gameObject.CompareTag("Enemy"))
        {
            Destroy(attPrefab);
        }
    }

    // Playerと生成されたプレハブのGameObjectのセッター
    public void SetObject(GameObject characterObject, GameObject attPrefab)
    {
        this.characterObject = characterObject;
        this.attPrefab = attPrefab;
    }

Inspector


・각 소스 파일을 첨부합니다.
  PlayerManager.cs ⇒ Player
  PlayerAttBehaviour.cs → Attack 01 (첨부된 것 같습니다)
  PlayerMagicAtt.cs ⇒ Meteor
· 메텔러의'Sphere Collider'의'Is Trigger'를 검사한다.
이상은 Meteor 프리셋 허브의 생성으로 플레이어의 정면으로 발사되며 1초 후 사라집니다.

좋은 웹페이지 즐겨찾기