簡體   English   中英

使用 Unity:編寫敵人 AI 腳本 - 跟隨玩家

[英]Using Unity: Scripting Enemy AI - Follow Player

我試圖讓我的敵人在范圍內跟隨我的玩家,否則敵人在流浪。 我對 C-Sharp 很陌生,所以一直在拼湊其他教程代碼。

目前,敵人在我設置的觸發盒對撞機之間來回徘徊。 當玩家在范圍內時,敵人將狀態切換為跟隨,但是如果玩家在敵人的左側,敵人只會向玩家移動,如果我在敵人的右側,它會被卡住直到我我超出范圍,然后它恢復流浪。 跟隨時敵人也不會翻轉面對敵人。

任何幫助,將不勝感激。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public enum EnemyState
   {
      Wander,   
      Follow,
      Die,
   };


public class EnemyController : MonoBehaviour
   {
     GameObject player;    
     public EnemyState currState = EnemyState.Wander; 
     public Transform target;
     Rigidbody2D myRigidbody;

     public float range = 2f;    
     public float moveSpeed = 2f;



void Start()
{
    player = GameObject.FindGameObjectWithTag("Player");
    myRigidbody = GetComponent<Rigidbody2D>();
    target = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();
}

void Update()
{

    switch (currState)
    {
        case (EnemyState.Wander):
            Wander();
            break;
        case (EnemyState.Follow):
            Follow();
            break;
        case (EnemyState.Die):
           // Die();
            break;
    }    

    if(IsPlayerInRange(range) && currState != EnemyState.Die)
    {
        currState = EnemyState.Follow;
    }
    else if(!IsPlayerInRange(range)&& currState != EnemyState.Die)
    {
        currState = EnemyState.Wander;
    }
}

private bool IsPlayerInRange(float range)
{
    return Vector3.Distance(transform.position, player.transform.position) <= range;
}

bool isFacingRight()
{
    return transform.localScale.x > 0;
}

void Wander()
{
    {
        if (isFacingRight())
        {
            myRigidbody.velocity = new Vector2(moveSpeed, 0f);
        }
        else
        {
            myRigidbody.velocity = new Vector2(-moveSpeed, 0f);
        }
    }

}

void OnTriggerExit2D(Collider2D collision) //this is to flip the sprite when it reaches the end of its path - a box 2d collider trigger
{
    transform.localScale = new Vector2(-(Mathf.Sign(myRigidbody.velocity.x)), 1f);

}

void Follow()
{
    if (isFacingRight())
    {
        myRigidbody.velocity = new Vector2(-moveSpeed, 0f);
        transform.position = Vector2.MoveTowards(transform.position, new Vector2(target.position.x, transform.position.y), moveSpeed * Time.deltaTime);

    }
   /* else //this seems to have no effect on the code
    {
        myRigidbody.velocity = new Vector2(moveSpeed, 0f);
        transform.position = Vector2.MoveTowards(transform.position, new Vector2(target.position.x, transform.position.y), -moveSpeed * Time.deltaTime);
    }*/

}

}

好的,我想出了我自己的問題,這是工作腳本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public enum EnemyState
{
  Wander,
  Follow,
  Die,
};

public class EnemyController : MonoBehaviour
{
  GameObject player;
  public EnemyState currState = EnemyState.Wander;

  public Transform target;

  Rigidbody2D myRigidbody;

  public float range = 2f;
  public float moveSpeed = 2f;






// Start is called before the first frame update
void Start()
{
    player = GameObject.FindGameObjectWithTag("Player");
    myRigidbody = GetComponent<Rigidbody2D>();
    target = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();



}

// Update is called once per frame
void Update()
{

    switch (currState)
    {
        case (EnemyState.Wander):
            Wander();
            break;
        case (EnemyState.Follow):
            Follow();
            break;
        case (EnemyState.Die):
           // Die();
            break;
    }    

    if(IsPlayerInRange(range) && currState != EnemyState.Die)
    {
        currState = EnemyState.Follow;
    }
    else if(!IsPlayerInRange(range)&& currState != EnemyState.Die)
    {
        currState = EnemyState.Wander;
    }
}

private bool IsPlayerInRange(float range)
{
    return Vector3.Distance(transform.position, player.transform.position) <= range;
}

bool isFacingRight()
{
    return transform.localScale.x > 0;
}

void Wander()
{
    {
        if (isFacingRight())
        {
            myRigidbody.velocity = new Vector2(moveSpeed, 0f);
        }
        else
        {
            myRigidbody.velocity = new Vector2(-moveSpeed, 0f);
        }
    }


}

void OnTriggerExit2D(Collider2D collision)
{
    transform.localScale = new Vector2(-(Mathf.Sign(myRigidbody.velocity.x)), 1f);

}


void Follow()
{

    if (transform.position.x > target.position.x)
    {
        //target is left
        transform.localScale = new Vector2(-1, 1);
        myRigidbody.velocity = new Vector2(-moveSpeed, 0f);
        transform.position = Vector2.MoveTowards(transform.position, new Vector2(target.position.x, transform.position.y), moveSpeed * Time.deltaTime);
    }
    else if (transform.position.x < target.position.x)
    {
        //target is right
        transform.localScale = new Vector2(1, 1);
        myRigidbody.velocity = new Vector2(moveSpeed, 0f);
        transform.position = Vector2.MoveTowards(transform.position, new Vector2(target.position.x, transform.position.y), moveSpeed * Time.deltaTime);
    }

}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM