这是我根据书上写的俯视视角的游戏敌人,可我试了半天怎么也把他改不成横版游戏的算法;他总是会在Y轴上跟随玩家移动,并且基本不会转向,还有个问题是我希望在他转向时Y轴欧拉角变为180(就是精灵转向),我怎么也试不出来 ,能帮忙看看嘛,非常感谢。
public class Wander : MonoBehaviour
{
public float pursuitSpeed; //追击速度
public float wanderSpeed; //漫游速度
float currentSpeed; //当前速度
public float directionChangeInterval; //改变漫游方向的频率
public bool followPlayer ; //是否追逐玩家
Coroutine moveCoroutine;
Rigidbody2D rb2d;
Animator animator;
Transform targetTransform = null;
Vector3 endPosition; //漫游目的
float currentAngle = 0;
private void Start()
{
animator = GetComponent<Animator>();
currentSpeed = wanderSpeed; //当前速度设置为漫游速度
rb2d = GetComponent<Rigidbody2D>();
//漫游入口
StartCoroutine(WanderRoutine());
}
public IEnumerator WanderRoutine()
{
while (true)
{
ChooseNewEndPoint(); //选择一个新终点
if(moveCoroutine != null) //检查是否有敌人在移动
{
StopCoroutine(moveCoroutine);
}
moveCoroutine = StartCoroutine(Move(rb2d, currentSpeed));
yield return new WaitForSeconds(directionChangeInterval);
}
}
void ChooseNewEndPoint()
{
currentAngle = Random.Range(0, 180);
currentAngle += Mathf.Repeat(currentAngle, 180);//对currentAngle的值进行循环,永远也不会小于0或者大于360
endPosition += Vector3FromAngle(currentAngle);
//将角度转换为向量
}
Vector3 Vector3FromAngle(float inputAngleDegress)
{
float inputAngleRadians = inputAngleDegress * Mathf.Deg2Rad; //角度转换成弧度
return new Vector3(Mathf.Cos(inputAngleRadians), 0,0); //弧度变成向量
}
public IEnumerator Move(Rigidbody2D rigidBodyToMove,float speed)
{
float remainingDistance = (transform.position - endPosition).sqrMagnitude; //当前位置到目的位置的距离
while (remainingDistance > float.Epsilon)
{
if(targetTransform != null)
{
endPosition = targetTransform.position;
}
if(rigidBodyToMove != null)
{
animator.SetBool("isWalking", true);
Vector3 newPostion = Vector3.MoveTowards(rigidBodyToMove.position, endPosition, speed * Time.deltaTime);
rb2d.MovePosition(newPostion);
remainingDistance = (transform.position - endPosition).sqrMagnitude;
}
yield return new WaitForFixedUpdate();
}
animator.SetBool("isWalking", false);
}
//碰转检测 遇到玩家追击
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.gameObject.CompareTag("Player") && followPlayer)
{
currentSpeed = pursuitSpeed;
targetTransform = collision.gameObject.transform;
}
if(moveCoroutine != null)
{
StopCoroutine(moveCoroutine);
}
moveCoroutine = StartCoroutine(Move(rb2d, currentSpeed));
}
//不再追击
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Player"))
{
animator.SetBool("isWalking", false);
currentSpeed = wanderSpeed;
if(moveCoroutine != null)
{
StopCoroutine(moveCoroutine);
}
targetTransform = null;
}
}