今天研究了一下午,总算把这个小鸟的逻辑给做出来了
用了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; } } }
返回原点以及巡逻
追击