【unity2D横板】【sunnyland】敌人巡逻追击主角以及返回原点

今天研究了一下午,总算把这个小鸟的逻辑给做出来了

用了Math.Pow(x,y),这是C#中用来求数字的幂的方法

还有Vector2.MoveTowards方法。

小鸟的逻辑是,自动巡逻,在侦察范围内发现主角则会一直追击主角逃出追击范围为止

假设逃出追击范围并且小鸟出界,那么它则往原点飞

我设置了三个状态

巡逻,追击,返回原点

看代码吧

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

public class eagleController : MonoBehaviour
{
    // Start is called before the first frame update

    public float speed = 3.0f;

    public float changeTime = 3.0f;
    float Timer;
    float direction = 1;
    Animator animator;

    public GameObject Player = null;//这里来存放主角对象

    private float XBorder;//X边界
    private float YBorder;//Y边界

    private bool discoverable;//发现主角

    private bool outside;//出界

    public float radial;//边界半径
    Vector2 origin;

    void Start()
    {
        
        Timer = changeTime;
        animator = GetComponent<Animator>();
        origin = transform.position;//存放原点
        XBorder = origin.x + radial;
        YBorder = origin.y;
    }

    // Update is called once per frame
    void Update()
    {
        Rigidbody2D playerRigid = Player.GetComponent<Rigidbody2D>();
        Vector2 beforePosition = transform.position;
        if (Math.Pow(playerRigid.position.x - transform.position.x, 2) + Math.Pow(playerRigid.position.y - transform.position.y, 2) <= Math.Pow(radial, 2))//在圆内,代表发现主角
        {
            flyAttack(Time.deltaTime, playerRigid);
            discoverable = true;
        }
        else discoverable = false;
        if (transform.position.x > origin.x + XBorder || transform.position.x < origin.x - XBorder || transform.position.y > origin.y + YBorder || transform.position.y < origin.y - YBorder)//巡逻边界
        {
            outside = true;
        }
        flyOrigin(origin, Time.deltaTime);
        flyNormal();
        Vector2 currentPosition = transform.position;
        animator.SetFloat("fly", currentPosition.x - beforePosition.x  );
    }
    private void OnCollisionEnter2D(Collision2D other)
    {
        foxcontroller fox = other.gameObject.GetComponent<foxcontroller>();
        if (fox != null)
        {
            fox.ChangeHealth(-1);
        }
    }
    private void flyNormal()//巡逻姿态
    {
        if (discoverable||outside)
        {
            return;
        }
        Vector2 position = transform.position;
        Timer -= Time.deltaTime;
        position.x = position.x + direction * Time.deltaTime * speed;
        transform.position = position;
        if (Timer < 0)
        {
            Timer = changeTime;
            direction = -direction;
        }
        animator.SetFloat("fly", direction);//动画控制
    }
    public void flyAttack(float dt,Rigidbody2D playerRigid)//攻击姿态
    {
        float quickSpeed = speed * 3;
        transform.position = Vector2.MoveTowards(transform.position, playerRigid.position, quickSpeed*dt);
        //Debug.Log(Math.Pow(playerRigid.position.x - transform.position.x, 2));
    }
    public void flyOrigin(Vector2 origin,float dt)//出界返回原点
    {
        if (discoverable||!outside)
        {
            return;
        }
        transform.position = Vector2.MoveTowards(transform.position,origin , speed * dt);
        if (transform.position.x == origin.x && transform.position.y == origin.y)
        {
            outside = false;
        }
    }
}

 返回原点以及巡逻

 追击

猜你喜欢

转载自blog.csdn.net/qq_63499305/article/details/130310052