实现思路
在游戏中,敌人通常是可以自动在地图上巡航的,这篇文章就用一个脚本简单实现这个功能。 我使用的精灵如下所示
假设我们让敌人沿着矩形自动巡航,那么我们需要写一个小型的状态机,一共有四种状态:上,下左,右。加入我们要让敌人按照顺时针方向的矩形路径自动巡航,那么状态切换应该是?上->右->下->左 。然后我们设定一下每个方向巡航的距离,这个距离就是函数检查的次数(不是物理意义上的距离),每当函数检查一次,那么这个距离就减一,当这个距离等于0的时候我们需要切换状态,然后重新设定距离的值。
以上就是简单的自动巡航的思路,按照这个思路,你可以写出复杂的自动巡航路线。当然这种实现方式可能不是最好的,因为这是我接触到这个问题的时候想到的第一种方案。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GebulinController : MonoBehaviour
{
// 哥布林的速度
public float speed = 5;
Animator animator;
Rigidbody2D rd2D;
// Start is called before the first frame update
void Start()
{
animator = GetComponent<Animator>();
rd2D = GetComponent<Rigidbody2D>();
}
enum state
{
up = 1,
right = 2,
down = 3,
left = 4
}
// x方向和y方向,取值为1,0,-1
public int direction_x = 0;
public int direction_y = 0;
public int EnemyState = (int)state.up;
// 某个方向巡航的帧数
public static int maxFlame = 500;
public int flame = maxFlame;
// 自动巡航
void autoWalk()
{
Debug.Log("开始巡航");
flame = flame - 1;
if (EnemyState == (int)state.up)
{
direction_x = 0;
direction_y = 1;
} else if (EnemyState == (int)state.right)
{
direction_x = 1;
direction_y = 0;
} else if (EnemyState == (int)state.down)
{
direction_x = 0;
direction_y = -1;
} else if (EnemyState == (int)state.left)
{
direction_x = -1;
direction_y = 0;
} else
{
Debug.Log("出错啦,没有这个状态!");
}
// 更新方向
Vector2 p = transform.position;
p.x = p.x + direction_x * speed * Time.deltaTime;
p.y = p.y + direction_y * speed * Time.deltaTime;
transform.position = p;
if (flame == 0)
{
if(EnemyState == (int)state.up)
{
EnemyState = (int)state.right;
} else if (EnemyState == (int)state.right)
{
EnemyState = (int)state.down;
} else if (EnemyState == (int)state.down)
{
EnemyState = (int)state.left;
} else if (EnemyState == (int)state.left)
{
EnemyState = (int)state.up;
}
flame = maxFlame;
}
}
// Update is called once per frame
void Update()
{
autoWalk();
}
}
最后实现的效果就是这样
画面有点粗糙哈哈。
如果你有更好的方法欢迎和我交流。
|