Unity¤Ë´ØÏ¢¤¹¤ëµ­»ö¤Ç¤¹

¥Ü¥¹¥Ð¥È¥ë


¡¡¥Ü¥¹¤Ë¸Â¤é¤º¤Ç¤¹¤¬¡¢¤¢¤ë°ìÄê¤Î¹ÔÆ°¥Ñ¥¿¡¼¥ó¤¬¤¢¤Ã¤Æ¡¢¤½¤ÎÃ椫¤é¥é¥ó¥À¥à¤Ê¹ÔÆ°¤ò¹Ô¤¦Ê¬´ô½èÍý¤¬¤¢¤ê¤Þ¤¹¡£

¡¡¶ñÂÎŪ¤Ê¹ÔÆ°ÆâÍưʳ°¤Ë¤Ä¤¤¤Æ¤Î¡¢Ê¬´ô½èÍý¤Î¼ÂÁõÎã¤òÄ󼨤·¤Þ¤¹¡£¹ÔÆ°ÆâÍƤϼ«Ê¬¤Ç¹Í¤¨¤Æ½ñ¤­¤Þ¤·¤ç¤¦¡£

¡¡²¼µ­¥µ¥ó¥×¥ëÆ°²è¤Ç¤Ï¡¢Çò¤¤ Cube ¤¬¥Ü¥¹Ìò¤Ç¤¹¡£


¡ã¼ÂÁõÆ°²è¡ä
Æ°²è¥Õ¥¡¥¤¥ë¤Ø¤Î¥ê¥ó¥¯



¡¡¤³¤ÎµóÆ°¤¬Àµ¾ï¤ËÆ°ºî¤¹¤ë¤³¤È¤¬³Îǧ¤Ç¤­¤¿¤é¡¢¼ÂºÝ¤Ë¼«Ê¬¤Ç£³£Ä¥â¥Ç¥ë¤òÇÛÃÖ¤·¡¢¥¢¥Ë¥á¡¼¥·¥ç¥ó¤Ê¤É¤ÎÀßÄê¤È
¹ÔÆ°ÆâÍƤνèÍý¤òÄɲ乤뤳¤È¤Ç¡¢Ê¬´ô¤Ë±þ¤¸¤¿¹ÔÆ°¤ò¼Â¹Ô¤µ¤»¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£


¡ã´°À®Îã¡ä
Æ°²è¥Õ¥¡¥¤¥ë¤Ø¤Î¥ê¥ó¥¯



¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ÎºîÀ®


¡¡Ç¤°Õ¤Î¥¢¥»¥Ã¥È¤Ê¤É¤«¤é¡¢¥Ü¥¹Ìò¤È¤Ê¤ë¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ò¥·¡¼¥ó¤ËÇÛÃÖ¤·¡¢¼«Ê¬¤Î¥²¡¼¥à¤Ë¤ª¤¤¤ÆɬÍפÊÀßÄê¤ò¹Ô¤¤¤Þ¤¹(¥³¥é¥¤¥À¡¼¤Ê¤É)
¤³¤Î¶µºà¤Ç¤Ï²¾¤Ë Cube ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ò¥Ü¥¹¤È¤·¤Æ¸«Î©¤Æ¤ÆÍøÍѤ·¤Æ¤¤¤Þ¤¹¡£

¡¡¤Þ¤¿¡¢¥Ü¥¹¤Î°ÜÆ°Àè¤È¤·¤Æ¡¢Create Empty ¤ò¹Ô¤Ã¤Æ¶õ¤Î¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤òÊ£¿ôºîÀ®¤·¡¢¤½¤ì¤ò¤µ¤é¤Ë¡¢¥Õ¥©¥ë¥ÀÌò¤Î¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Ë¤Þ¤È¤á¤ÆÃÖ¤­¤Þ¤¹¡£
¤³¤ÎÃÏÅÀÆâ¤Î¤¤¤º¤ì¤«¤Î°ÌÃ֤إé¥ó¥À¥à¤Ø°ÜÆ°¤¹¤ë¤è¤¦¤ËÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£
Transform ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤·¤«»ý¤¿¤Ê¤¤¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Ë¤Ï¡¢¥é¥Ù¥ë¤òÀßÄꤹ¤ë¤³¤È¤Ç Scene¥Ó¥å¡¼¤Ç²Ä»ë²½½ÐÍè¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£


¥Ò¥¨¥é¥ë¥­¡¼²èÁü



Scene ¥Ó¥å¡¼²èÁü(Çò¤¤ Cube ¤¬¥Ü¥¹Ìò¡£Â¾¤Î¥é¥Ù¥ë¤Î¤¢¤ë¤â¤Î¤¬°ÜÆ°Àè)




¡¡¥Õ¥©¥ë¥ÀÌò¤Î¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Î°ÌÃ֤ˤĤ¤¤Æ¤Ï¡¢¥Ü¥¹¤Î°ÌÃÖ¤ÈƱ¤¸¤Ë¤·¤Æ¤ª¤¯¤È¡¢Â¾¤Î°ÌÃÖ¤ò·è¤á¤ëºÝ¤ËÁêÂÐŪ¤Ë¹Í¤¨¤ë¤³¤È¤¬¤Ç¤­¤ÆÊØÍø¤Ç¤¹¡£


¥¤¥ó¥¹¥Ú¥¯¥¿¡¼²èÁü(¥Õ¥©¥ë¥ÀÌò)




¥µ¥ó¥×¥ë¥³¡¼¥É


¡¡¥Ü¥¹¤Î¥é¥ó¥À¥à¹ÔÆ°¤Èʬ´ô½èÍý¤Î¼ÂÁõÎã¤Ç¤¹¡£

¡¡¼ÂºÝ¤Î¹ÔÆ°ÆâÍƤˤĤ¤¤Æ¤Ï¡¢¤½¤ì¤¾¤ì¤Î¥²¡¼¥à¤ËŬ¤·¤¿ÆâÍƤǼÂÁõ¤ò¤ª¤³¤Ê¤Ã¤Æ¤¯¤À¤µ¤¤¡£
¤³¤³¤Ç¤Ï½èÍý¤Î³Îǧ¤Î¤¿¤á¡¢Debug.Log ¥á¥½¥Ã¥É¤Î¤ßµ­½Ò¤·¤Æ¤¤¤Þ¤¹¡£


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using DG.Tweening;

/// <summary>
/// ¥Ü¥¹¤Î¹ÔÆ°¥Ñ¥¿¡¼¥ó
/// </summary>
public enum BossActions 
{
    MoveToPosition,
    AttackA,
    AttackB,
    Idle,
    MoveAndAttack
}

/// <summary>
/// ¥Ü¥¹¤Î¹ÔÆ°¥Ñ¥¿¡¼¥ó¤´¤È¤Î½Å¤ßÉÕ¤±
/// </summary>
[System.Serializable]
public class BossActionWeight
{
    public BossActions Action;
    public int Weight;
}

public class BossBattle : MonoBehaviour
{
    [SerializeField, Header("°Üư®ÅÙ")] 
    private float moveSpeed = 10f;

    [SerializeField, Header("¼¡²ó¤Î¹ÔÆ°¤Þ¤Ç¤ÎÂÔµ¡»þ´Ö")] 
    private  float coolDownTime = 5f;
    
    [SerializeField, Header("°ÜÆ°Àè¤È¤Ê¤ëÃÏÅÀ")] 
    private Transform[] targetTrans;
    
    [SerializeField, Header("ÂÎÎÏ")] 
    private  float health;
    
    [SerializeField, Header("°ÜÆ°»þ¤Î¥¢¥Ë¥áÀßÄê")] 
    private Ease moveEase = Ease.Linear;
    
    [SerializeField, Header("¹ÔÆ°¥Ñ¥¿¡¼¥ó¤´¤È¤Î½Å¤ßÉÕ¤±")]
    private List<BossActionWeight> ActionWeights;
    
    [SerializeField, Header("Ä̾ï¤Î¹ÔÆ°¥Ñ¥¿¡¼¥ó")]
    private BossActions[] NormalActionPattern;
    
    [SerializeField, Header("¥Ø¥ë¥¹¤¬È¾Ê¬°Ê²¼¤Ë¤Ê¤Ã¤¿»þ¤Î¹ÔÆ°¥Ñ¥¿¡¼¥ó")]
    private BossActions[] HalfHealthActionPattern;
    
    private bool inCoolDown = false;
    private float initialHealth;
    
    private BossActions currentAction;  // ¸½ºß¤Î¹ÔÆ°
    public BossActions CurrentAction => currentAction;  // ¥×¥í¥Ñ¥Æ¥£
    

    void Start()
    {
        // ActionWeights ÊÑ¿ô¤¬¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤«¤é½é´ü²½¤µ¤ì¤Æ¤¤¤Ê¤¤(ÅÐÏ¿¤µ¤ì¤Æ¤¤¤Ê¤¤)¾ì¹ç¡¢List ¤ò½é´ü²½¤¹¤ë
        if(ActionWeights == null || ActionWeights.Count == 0)
        {
            ActionWeights = new List<BossActionWeight>
            {
                new BossActionWeight {Action = BossActions.MoveToPosition, Weight = 1},
                new BossActionWeight {Action = BossActions.AttackA, Weight = 1},
                new BossActionWeight {Action = BossActions.AttackB, Weight = 1},
                new BossActionWeight {Action = BossActions.Idle, Weight = 1},
                new BossActionWeight {Action = BossActions.MoveAndAttack, Weight = 0}
            };
        }

        initialHealth = health;
        
        // ¥Ü¥¹¤Î¹ÔÆ°³«»Ï
        StartCoroutine(BossBehavior());
    }
    
    /// <summary>
    /// ¥Ü¥¹¤Î¹ÔÆ°
    /// </summary>
    /// <returns></returns>
    private IEnumerator BossBehavior()
    {
        while(true) // Keep this loop running as long as the boss is alive.
        {
¡¡¡¡¡¡¡¡¡¡¡¡// ¥Ø¥ë¥¹¤¬»Ä¤Ã¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¹ÔÆ°¤ò½ªÎ»
            if(health <= 0) 
            {
                break; // Stop the loop if the boss is defeated.
            }

¡¡¡¡¡¡¡¡¡¡¡¡// ¥é¥ó¥À¥à¤Ê¹ÔÆ°¤ò½Å¤ßÉÕ¤±¤·¤Æ¤¤¤ëÃ椫¤é£±¤ÄÁªÂò
            currentAction = GetRandomActionByWeight();

¡¡¡¡¡¡¡¡¡¡¡¡// ÁªÂò¤µ¤ì¤¿¹ÔÆ°¤ò¼Â¹Ô
            switch(currentAction)
            {
                case BossActions.MoveToPosition:
                    // ÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë°ÌÃÖ¤ÎÃæ¤Ç¡¢¥é¥ó¥À¥à¤Ê°ÌÃ֤˰ÜÆ°
                    MoveToPosition(targetTrans[Random.Range(0, targetTrans.Length)].position);
                    break;

                case BossActions.AttackA:
                    AttackA();
                    break;

                case BossActions.AttackB:
                    AttackB();
                    break;

                case BossActions.Idle:
                    Idle();
                    break;

                case BossActions.MoveAndAttack:
                    MoveAndAttack(targetTrans[Random.Range(0, targetTrans.Length)].position);
                    break;
            }

            yield return new WaitForSeconds(coolDownTime);
        }
    }
    
    /// <summary>
    /// ½Å¤ßÉÕ¤±¤òÍøÍѤ·¤¿¹ÔÆ°¤Î·èÄê
    /// </summary>
    /// <returns></returns>
    private BossActions GetRandomActionByWeight()
    {
        // ¸½ºß¤Î¥é¥¤¥Õ¤Î»Ä¿ô¤Ë´ð¤Å¤¤¤Æ¡¢Å¬ÀڤʹÔÆ°¥Ñ¥¿¡¼¥ó¤òÁªÂò
        BossActions[] actionPattern = health <= initialHealth / 2 ? HalfHealthActionPattern : NormalActionPattern;

        // ¤½¤Î¹ÔÆ°¥Ñ¥¿¡¼¥ó¤Ë´Þ¤Þ¤ì¤ë¹ÔÆ°¤Î¤ß¤Î½Å¤ß¤ò¹ç·×
        int totalWeight = ActionWeights.Where(a => actionPattern.Contains(a.Action)).Sum(a => a.Weight);

        // ¥é¥ó¥À¥à¤Ê¹ÔÆ°¤òÁª¤Ö¤¿¤á¤ÎÍð¿ô¤ò¼èÆÀ(ÂоݤȤʤëÁªÂò»è¤ÏÁªÂò¤·¤¿¹ÔÆ°¥Ñ¥¿¡¼¥ó¤Î¹ÔÆ°¤À¤±¤Ë¸ÂÄê)
        int randomValue = Random.Range(0, totalWeight);
        int weightSum = 0;

        // Íð¿ô¤«¤éº£²ó¤Î¹ÔÆ°¤ò³ÎÄê(ÂоݤȤʤëÁªÂò»è¤ÏÁªÂò¤·¤¿¹ÔÆ°¥Ñ¥¿¡¼¥ó¤Î¹ÔÆ°¤À¤±¤Ë¸ÂÄê)
        for (int i = 0; i < ActionWeights.Count; i++) {
            if (!actionPattern.Contains(ActionWeights[i].Action)) {
                continue;
            }

            weightSum += ActionWeights[i].Weight;

            if (randomValue < weightSum) {
                return ActionWeights[i].Action;
            }
        }

        return BossActions.Idle; // Default return value, in case something goes wrong.
    }
    
    private void MoveToPosition(Vector3 target)
    {
        transform.DOMove(target, moveSpeed).SetEase(moveEase).SetSpeedBased();

        Debug.Log("MoveToPosition");
    }

    private void AttackA()
    {
        // TODO Implement AttackA here
        
        Debug.Log("AttackA");
    }

    private void AttackB()
    {
        // TODO Implement AttackB here
        
        Debug.Log("AttackB");
    }

    private void Idle()
    {
        // TODO Idle behavior, do nothing
        
        Debug.Log("Idle");
    }

    private void MoveAndAttack(Vector3 target)
    {
        MoveToPosition(target);
        AttackA();
        
        // TODO Implement Attack here
        
        Debug.Log("MoveAndAttack");
    }
}



½èÍý¤Î²òÀâ


¡¡¥Ü¥¹¤Î¹ÔÆ°¥Ñ¥¿¡¼¥ó¤òEnum¤Ç BossActions ¤ÈÄêµÁ¤·¡¢¹ÔÆ°¥Ñ¥¿¡¼¥ó¤Î¼ïÎà¤òÎóµó»Ò¤È¤·¤ÆÅÐÏ¿¤·¤Þ¤¹¡£

/// <summary>
/// ¥Ü¥¹¤Î¹ÔÆ°¥Ñ¥¿¡¼¥ó
/// </summary>
public enum BossActions 
{
    MoveToPosition,
    AttackA,
    AttackB,
    Idle,
    MoveAndAttack
}

¡¡Â¾¤Ë¤â¹ÔÆ°¤Î¼ïÎà¤òÁý¸º¤·¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢¤Þ¤º¤Ï¤³¤Á¤é¤Ë¾ðÊó¤òÅÐÏ¿¤·¤Þ¤¹¡£

¡¡¤³¤Î BossActions ¤Î¤¦¤Á£±¤Ä¤ÎÃͤò¡¢ÊÑ¿ô¤È¤·¤ÆÊÝ»ý¤·¤Þ¤¹¡£
¤³¤ì¤¬¥Ü¥¹¤ÎµóÆ°À©¸æ¤Î¥Ù¡¼¥¹¤È¤Ê¤ê¤Þ¤¹¡£

public BossActions currentAction;  // ¸½ºß¤Î¹ÔÆ°



¡¡¼¡¤Ë¡¢³Æ¥¢¥¯¥·¥ç¥ó¤ËÂбþ¤¹¤ë½Å¤ß¤òÊÝ»ý¤¹¤ë¥¯¥é¥¹¤òºîÀ®¤·¡¢¤½¤Î¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ò¥ê¥¹¥È¤ÇÊÝ»ý¤·¤Þ¤¹¡£

/// <summary>
/// ¥Ü¥¹¤Î¹ÔÆ°¥Ñ¥¿¡¼¥ó¤´¤È¤Î½Å¤ßÉÕ¤±
/// </summary>
[System.Serializable]
public class BossActionWeight
{
    public BossActions Action;
    public int Weight;
}


// ÊÝ»ý¤¹¤ë¤¿¤á¤ÎÊÑ¿ô
[SerializeField, Header("¹ÔÆ°¥Ñ¥¿¡¼¥ó¤´¤È¤Î½Å¤ßÉÕ¤±")]
private List<BossActionWeight> ActionWeights;

¡¡ÊÑ¿ô¤Ë¤Ï SerializeField°À­¤òÉÕÍ¿¤·¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢¤³¤Î List ¤Ï¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤«¤éÀßÄ꤬²Äǽ¤Ç¤¹¡£
¤Þ¤¿ BossActionWeight ¥¯¥é¥¹¤Ë¤â System.Serializable°À­¤¬ÉÕÍ¿¤µ¤ì¤Æ¤¤¤ë¤¿¤á¡¢¥¯¥é¥¹ÆâÉô¤Î¾ðÊó¤â¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤«¤éÀßÄ꤬²Äǽ¤Ç¤¹¡£

¡¡²¼µ­¤Î¥µ¥ó¥×¥ë²èÁü¤Î¤è¤¦¤ËÍøÍѤ·¤Þ¤¹¡£
BossActions(Enum) ¤ÎÅÐÏ¿½ç¤ÏÎóµó»Ò¤Î½çÈÖÄ̤ê¤Ç¤Ê¤¯¤Æ¤âÌäÂꤢ¤ê¤Þ¤»¤ó¤¬¡¢¸«¤ä¤¹¤µ¤ò¹Íθ¤·¤Æ¡¢Æ±¤¸Ê¤ӽç¤Ë¤·¤Æ¤¤¤Þ¤¹¡£
Ʊ¤¸Îóµó»Ò¤ò»ØÄꤷ¤Ê¤¤¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£


¥¤¥ó¥¹¥Ú¥¯¥¿¡¼²èÁü



¡¡¤³¤Î ActionWeights(List) ¤òÍøÍѤ¹¤ë¤³¤È¤Ç¡¢LINQ¤ò»ÈÍѤ·¤ÆÆÃÄê¤Î¾ò·ï¤òËþ¤¿¤¹½Å¤ß¤À¤±¤ò¹ç·×¤·¤¿¤ê¡¢ÆÃÄê¤Î¹ÔÆ°¤òÃê½Ð¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£



¡¡ºÇ¸å¤Ë¥Ü¥¹¤Î¹ÔÆ°¤ò¥³¥ó¥È¥í¡¼¥ë¤¹¤ë¤¿¤á¤Î¥¯¥é¥¹¤òÄêµÁ¤·¤Þ¤¹¡£

¡¡³Æ¼ï¤ÎÊÑ¿ô¤Ï¡¢Ç¤°Õ¤ËÁý¸º¤·¤Æ¤¯¤À¤µ¤¤¡£
º£²ó¤Ï¡¢Ä̾ï¤Î¹ÔÆ°¥Ñ¥¿¡¼¥ó¤È¡¢¥Ø¥ë¥¹¤¬È¾Ê¬°Ê²¼¤Ë¤Ê¤Ã¤¿»þ¤Î¹ÔÆ°¥Ñ¥¿¡¼¥ó¤ò¡¢
¤½¤ì¤¾¤ìNormalActionPattern¤ÈHalfHealthActionPatternÇÛÎó¤ÇÊÝ»ý¤·¤Æ¤¤¤Þ¤¹¡£
¤³¤ì¤Ë¤è¤ê¡¢Unity¤Î¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤«¤éľÀÜ¡¢¤É¤Î¹ÔÆ°¤¬¤É¤Î¾õÂ֤DzÄǽ¤«¤òÀßÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

[SerializeField, Header("Ä̾ï¤Î¹ÔÆ°¥Ñ¥¿¡¼¥ó")]
private BossActions[] NormalActionPattern;
    
[SerializeField, Header("¥Ø¥ë¥¹¤¬È¾Ê¬°Ê²¼¤Ë¤Ê¤Ã¤¿»þ¤Î¹ÔÆ°¥Ñ¥¿¡¼¥ó")]
private BossActions[] HalfHealthActionPattern;

¡¡²¼µ­¤Î¥µ¥ó¥×¥ë²èÁü¤Î¤è¤¦¤Ë¡¢¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤«¤éÅÐÏ¿¤·¤ÆÍøÍѤ·¤Þ¤¹¡£
ÅÐÏ¿¤¹¤ë¿ô¤ä½çÈ֤ʤɤÏǤ°Õ¤Ç¤¹¡£¤³¤³¤Ç¤âƱ¤¸Îóµó»Ò¤ÏÅÐÏ¿¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£


¥¤¥ó¥¹¥Ú¥¯¥¿¡¼²èÁü




¡¡Start ¥á¥½¥Ã¥É¤Ç¤Ï¡¢ActionWeights(List) ¤¬¤â¤·¥¤¥ó¥¹¥Ú¥¯¥¿¤«¤é½é´ü²½¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢³Æ¹ÔÆ°¤´¤È¤Ë¥Ç¥Õ¥©¥ë¥È¤Î½Å¤ß¤òÀßÄꤷ¤Þ¤¹¡£
¾¤Ë¤âÀßÄ꤬¤¢¤ì¤Ð Start ¥á¥½¥Ã¥ÉÆâ¤ÇÀßÄê¤ò¤·¤Þ¤¹¡£
¤½¤ì¤é¤¬½ªÎ»¤·¤Æ¤«¤é¡¢¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤Ç¤¢¤ë BossBehavior ¥á¥½¥Ã¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£

¡¡BossBehavior ¥á¥½¥Ã¥É¤Ï while ʸ¤Ë¤è¤Ã¤Æ¥ë¡¼¥×½èÍý¤¬¹Ô¤ï¤ì¤Æ¤ª¤ê¡¢¥Ü¥¹¤Î¥Ø¥ë¥¹¤¬ 0 ¤Ë¤Ê¤ë¤Þ¤Ç¡¢¤³¤Î¥ë¡¼¥×½èÍý¤¬·«¤êÊÖ¤µ¤ì¤Þ¤¹¡£
¤½¤·¤Æ¡¢°ìÄê»þ´Ö¤´¤È¤Ë¡¢¥Ü¥¹¤¬¹ÔÆ°¤¹¤ë¥í¥¸¥Ã¥¯¤¬ÁȤޤì¤Æ¤¤¤Þ¤¹¡£

¡¡GetRandomActionByWeight()¥á¥½¥Ã¥É¤Ç¤Ï¡¢¤Þ¤º¸½ºß¤Î¥Ø¥ë¥¹¤Ë´ð¤Å¤¤¤ÆŬÀڤʹÔÆ°¥Ñ¥¿¡¼¥ó¤òÁªÂò¤·¤Þ¤¹¡£
¼¡¤Ë¡¢¤½¤Î¹ÔÆ°¥Ñ¥¿¡¼¥ó¤Ë´Þ¤Þ¤ì¤ë¹ÔÆ°¤Î¤ß¤Î½Å¤ß¤ò¹ç·×¤·¤Þ¤¹¡£¤½¤·¤Æ¡¢¥é¥ó¥À¥à¤Ê¹ÔÆ°¤òÁª¤Ó¤Þ¤¹¤¬¡¢¤½¤ÎºÝ¤ËÁªÂò»è¤ÏÁªÂò¤·¤¿¹ÔÆ°¥Ñ¥¿¡¼¥ó¤Î¹ÔÆ°¤À¤±¤Ë¸ÂÄꤷ¤Þ¤¹¡£

¡¡¤½¤Î¸å¡¢switch ʸ¤Ë¤è¤ê¡¢ÁªÂò¤µ¤ì¤¿¹ÔÆ°¤Ë±þ¤¸¤¿¥á¥½¥Ã¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ç¡¢¥Ü¥¹¤Î¹ÔÆ°¤ò¹Ô¤¤¤Þ¤¹¡£
°ÜÆ°¤Î½èÍý¤Ë¤Ä¤¤¤Æ¤Ï¡¢DOTween ¤òÍøÍѤ·¤¿½èÍý¤ò²¾¼ÂÁõ¤·¤Æ¤¤¤Þ¤¹¡£targetTrans ÇÛÎóÊÑ¿ô¤ËÅÐÏ¿¤·¤Æ¤¢¤ë¤¤¤º¤ì¤«£±¤Ä¤Î°ÌÃÖ¤ò¥é¥ó¥À¥à¤ÇÁªÂò¤·¤Æ°ÜÆ°¤·¤Þ¤¹¡£

[SerializeField, Header("°ÜÆ°Àè¤È¤Ê¤ëÃÏÅÀ")] 
private Transform[] targetTrans;

// ÁªÂò¤µ¤ì¤¿¹ÔÆ°¤ò¼Â¹Ô
switch(currentAction)
{
¡¡¡¡case BossActions.MoveToPosition:
        // ÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë°ÌÃÖ¤ÎÃæ¤Ç¡¢¥é¥ó¥À¥à¤Ê°ÌÃ֤˰ÜÆ°
        MoveToPosition(targetTrans[Random.Range(0, targetTrans.Length)].position);
        break;

¡¡¤É¤ÎÊÑ¿ô¤¬¤É¤Î½èÍý¤ËÂФ·¤Æ¡¢¤É¤Î¤è¤¦¤ËÍøÍѤµ¤ì¤Æ¤¤¤ë¤«¤òÇÄ°®¤·¤Æ¤ª¤¯¤³¤È¤¬ÂçÀڤǤ¹¡£



¡¡°ÜÆ°½èÍý¤Ë¤Ï DOMove ¥á¥½¥Ã¥É¤Ë²Ã¤¨¤Æ¡¢SetEase ¥á¥½¥Ã¥É¤È SetSpeedBase ¥á¥½¥Ã¥É¤ò¥ª¥×¥·¥ç¥ó¤ÇÉÕÍ¿¤·¤Æ¤¤¤Þ¤¹¡£
SetEase ¥á¥½¥Ã¥É¤Î°ú¿ô¤Ë¤ÏÊÑ¿ô¤ò»ØÄꤹ¤ë¤³¤È¤Ç¡¢¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤«¤éÀßÄ꤬²Äǽ¤Ç¤¹¡£¥²¡¼¥à²èÌ̤ò¸«¤Ê¤¬¤é¡¢°ÜÆ°¤Î¥¢¥Ë¥á¤òÄ´À°¤·¤Þ¤·¤ç¤¦¡£
¤Þ¤¿¡¢SetSpeedBase ¥á¥½¥Ã¥É¤òÉÕÍ¿¤¹¤ë¤³¤È¤Ç¡¢DOMove ¥á¥½¥Ã¥É¤ÎÂè2°ú¿ô¤Î»ØÄ꤬¡Ö»þ´Ö¡×¤Ç¤Ï¤Ê¤¯¡Ö®Å١פȤ·¤ÆÍøÍѤµ¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
¤½¤Î¤¿¤á¡¢°ÜÆ°Àè¤È¤Ê¤ëÌÜɸÃÏÅÀ¤Î±ó¶á¤Ë¤è¤ë®ÅÙ¤ÎÊѲ½¤òÇÓ½ü¤¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£

[SerializeField, Header("°Üư®ÅÙ")] 
private float moveSpeed = 10f;

[SerializeField, Header("°ÜÆ°»þ¤Î¥¢¥Ë¥áÀßÄê")] 
private Ease moveEase = Ease.Linear;


private void MoveToPosition(Vector3 target)
{
    transform.DOMove(target, moveSpeed).SetEase(moveEase).SetSpeedBased();

    Debug.Log("MoveToPosition");
}


»²¹Í¥µ¥¤¥È
Qiita @BEATnonanka ÍÍ
DOTween´°Á´¤ËÍý²ò¤¹¤ë¤½¤Î7 ¥ª¥×¥·¥ç¥óÊÔ

¥Ï¥ë¥·¥ª¥ó¥Ö¥í¥° ÍÍ
Dotween¤Ç¥ª¥Ö¥¸¥§¥¯¥È¤ò°ÜÆ°¤·¤¿¤ê¤¹¤ëºÝ¤Ë¡¢»þ´Ö¤Ç¤Ê¤¯Â®ÅÙ¤ÇÆ°¤«¤¹ÊýË¡



¡¡ºÇ¸å¤Ë»ØÄꤵ¤ì¤¿ÂÔµ¡»þ´Ö¤ËÆþ¤Ã¤Æ¤«¤é¡¢while ʸ¤¬ºÇ½é¤ËÌá¤ê¡¢ºÆÅÙ¡¢¥Ü¥¹¤Î¹ÔÆ°¤ò¥é¥ó¥À¥à¤Ç·èÄꤷ¡¢¹ÔÆ°¤ò·«¤êÊÖ¤·¤Þ¤¹¡£


ÀßÄê


¡¡¥Ü¥¹¤Î¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥¹¥¯¥ê¥×¥È¤ò¥¢¥¿¥Ã¥Á¤·¤Þ¤¹¡£


¥¤¥ó¥¹¥Ú¥¯¥¿¡¼²èÁü(ÀßÄêÁ°)





¡¡³ÆÇÛÎó¤È List ¤ò½é´ü²½¤·¡¢Ç¤°Õ¤Î¾ðÊó¤òÀßÄꤷ¤Þ¤¹¡£

¡¡¥Ü¥¹¤Î°ÜÆ°Àè¤Ë¤Ä¤¤¤Æ¤Ï¡¢¤³¤ÎÎã¤Ç¤Ï£³²Õ½ê¤ò»ØÄꤷ¤Æ¤¤¤Þ¤¹¡£

¡¡BossActionWeight ¤Î Weight ¤ÎÃͤâǤ°Õ¤Ç¤¹¡£³Æ Enum ¤è¤ê½ÅÊ£¤·¤Ê¤¤¤è¤¦¤Ë£±¤Ä¤òÁªÂò¤·¡¢ÃͤòÀßÄꤷ¤Þ¤¹¡£
¤³¤ÎÃͤϥѡ¼¥»¥ó¥Èɽ¼¨¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£³Æ Weight ¤Î¹ç·×Ãͤò 100 ¤È¤·¤Æ¤ß¤Æ½Å¤ßÉÕ¤±¤Ç·×»»¤¹¤ë¤¿¤á¡¢¤½¤ì¤¾¤ì¤ÎÃͤÏÂ礭¤¤¤Û¤ÉÁªÂò¤µ¤ì¤ä¤¹¤¯¤Ê¤ê¤Þ¤¹¡£


¥¤¥ó¥¹¥Ú¥¯¥¿¡¼²èÁü(ÀßÄê¸å)




¥²¡¼¥à¤ò¼Â¹Ô¤·¤ÆÆ°ºî¤ò³Îǧ¤¹¤ë


¡¡¥½¡¼¥¹¥³¡¼¥É¤Î½èÍý¤ò¸«Ä¾¤·¤Æ¡¢¤É¤¦¤¤¤¦½èÍý¤¬½ñ¤«¤ì¤Æ¤¤¤ë¤Î¤«¡¢¤Þ¤¿¡¢¥²¡¼¥à¤ò¼Â¹Ô¤·¤¿ºÝ¤Ë¤Ï
¤É¤¦¤¤¤Ã¤¿µóÆ°¤¬ÁÛÄꤵ¤ì¤ë¤Î¤«¤òÍý²ò¤·¤Æ¤«¤é¡¢¥²¡¼¥à¤ò¼Â¹Ô¤¹¤ë¤è¤¦¤Ë¤·¤Þ¤·¤ç¤¦¡£

¡¡¥Ç¥Ð¥Ã¥°¤ò¹Ô¤¦ºÝ¤Ë¤Ï»öÁ°¤ÎÍý²ò¤¬½ÅÍפǤ¹¡£¤¿¤À¥²¡¼¥à¤¬Æ°¤±¤Ð¤¤¤¤¡¢¤È¤¤¤¦¤â¤Î¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£


¡ã³Îǧư²è¡ä
Æ°²è¥Õ¥¡¥¤¥ë¤Ø¤Î¥ê¥ó¥¯




¡¡°Ê¾å¤Ë¤Ê¤ê¤Þ¤¹¡£
¤³¤Î¥µ¥ó¥×¥ë¥³¡¼¥É¤ò¥Ù¡¼¥¹¤Ë²þÎɤ·¤Æ¡¢¼«Ê¬¤À¤±¤Î¥Ç¥¶¥¤¥ó¤ò¹Ô¤Ã¤Æ¤ß¤Þ¤·¤ç¤¦¡£



¡¡°Ê¾å¤Ç¤³¤Î¼ê½ç¤Ï½ªÎ»¤Ç¤¹¡£

¡¡¼¡¤Ï¡¡±þÍÑ£²¡¡¡¼¥«¥Ã¥È¥·¡¼¥ó¤Î¼ÂÁõÎã­¡¡Ý¡¡¤Ç¤¹¡£

¥³¥á¥ó¥È¤ò¤«¤¯


¡Öhttp://¡×¤ò´Þ¤àÅê¹Æ¤Ï¶Ø»ß¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

ÍøÍѵ¬Ìó¤ò¤´³Îǧ¤Î¤¦¤¨¤´µ­Æþ²¼¤µ¤¤

Menu



´ðÁÃ

µ»½Ñ/Ãμ±(¼ÂÁõÎã)

3D¥¢¥¯¥·¥ç¥ó¥²¡¼¥à

2D¤ª¤Ï¤¸¤­¥²¡¼¥à(ȯŸÊÔ)

2D¶¯À©²£¥¹¥¯¥í¡¼¥ë¥¢¥¯¥·¥ç¥ó(ȯŸÊÔ)

2D¥¿¥Ã¥×¥·¥å¡¼¥Æ¥£¥ó¥°(³ÈÄ¥ÊÔ)

¥ì¡¼¥¹¥²¡¼¥à(È´¿è)

2DÊüÃÖ¥²¡¼¥à(ȯŸÊÔ)

3D¥ì¡¼¥ë¥¬¥ó¥·¥å¡¼¥Æ¥£¥ó¥°(±þÍÑÊÔ)

3Dæ½Ð¥²¡¼¥à(È´¿è)

2D¥ê¥¢¥ë¥¿¥¤¥à¥¹¥È¥é¥Æ¥¸¡¼

3D¥¿¥Ã¥×¥¢¥¯¥·¥ç¥ó(NavMeshAgent »ÈÍÑ)

2D¥È¥Ã¥×¥Ó¥å¡¼¥¢¥¯¥·¥ç¥ó(¥«¥¨¥ë¤Î°Ù¤Ë¡Á¡¢¥Ü¥³¥¹¥«¥¦¥©¡¼¥ºÉ÷)

VideoPlayer ¥¤¥Ù¥ó¥ÈϢư¤Î¼ÂÁõÎã

VideoPlayer ¥ê¥¹¥ÈÆ⤫¤é¥à¡¼¥Ó¡¼ºÆÀ¸¤Î¼ÂÁõÎã(ȯŸ)

AR ²èÁüÉÕ¤­¥ª¥Ö¥¸¥§¥¯¥ÈÀ¸À®¤Î¼ÂÁõÎã

AR ¥ê¥¹¥ÈÆ⤫¤éÀ¸À®¤Î¼ÂÁõÎã(ȯŸ)

2D¥È¥Ã¥×¥Ó¥å¡¼¥¢¥¯¥·¥ç¥ó(¥µ¥Ð¥¤¥Ð¡¼É÷)

private



¤³¤Î¥µ¥¤¥ÈÆâ¤ÎºîÉʤϥæ¥Ë¥Æ¥£¤Á¤ã¤ó¥é¥¤¥»¥ó¥¹¾ò¹à¤Î¸µ¤ËÄ󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£

´ÉÍý¿Í/Éû´ÉÍý¿Í¤Î¤ßÊÔ½¸¤Ç¤­¤Þ¤¹