unity2D让游戏物体在不规则范围内随机移动
整体思路是,利用polygon collider 2D做了一个边缘的触发器,但是如果只是让游戏物体触碰到边缘后,随机改变方向,或者仅仅只是方向取反,会造成下列一些极限情况。
比如随机取一个方向,就直接从边缘朝外面移动了,这里如果说给一个随机方向的范围,但因为是不规则边缘,那么很有可能一开始游戏物体的运动方向和边缘的切线就只有10°,或者更小,那么无论怎样都会有个极限情况,让游戏物体飞到了外界。
如果取反的话,会看着游戏物体非常的僵硬。
下面我要做的就是让鸡在鸡圈中随机移动,并且不会移动到鸡圈外。
第一步,加一个polygon检测器
按照你想要的区域,把它勾出来即可
第二步,加几个随机点,这在后面,判断碰到碰撞器的时候有用。
注意随机点最好几个方向都有一个,并且要放在边缘碰撞检测的里面。
第三步,给挂有边缘检测的gameobject加一个脚本
用来判断,当游戏物体从检测器中离开的时候,该怎么做。
private void OnTriggerExit2D(Collider2D collision)
{
int temp= Random.Range(0, ChickenPenManage.instance.spawns.Length);//在第二步的随机点中随机选一个出来
while(temp==collision.gameObject.GetComponent<Move>().index)//这个随机点和前一个随机点不能相同,如果相同的话,就会直接出边界了。
{
temp = Random.Range(0, ChickenPenManage.instance.spawns.Length);
}
collision.gameObject.GetComponent<Move>().dir = ChickenPenManage.instance.spawns[temp].position-collision.transform.position;//给游戏物体一个到随机点的方向,这个方向就是它接下来的运动方向。
collision.gameObject.GetComponent<Move>().index = temp;//记录当前随机点
}
第四步
给游戏物体挂上一个控制它运动的脚本
public float speed = 10;
public Vector3 dir;//this.gameobject的运动方向
public int index;//记录随机点
private float time ;//定时器
public bool isWalk;//状态判断
private Animator Anim;
// Start is called before the first frame update
void Start()
{
dir = new Vector3(Random.Range(-10, 10), Random.Range(-10, 10), 0);//给游戏物体一个初始方向,让它去撞击边界触发器
Anim = GetComponent<Animator>();
Anim.Play("run");
time = 0;
isWalk = true;
}
// Update is called once per frame
void Update()
{
time += Time.deltaTime;//定时
if(time>3)//3秒改变一次状态,让游戏物体可以停停走走,不然很僵硬
{
ChangeState();
}
//一种运动中状态
//一种停止状态 //两秒变换一次状态
if(isWalk)
{
//运动: anim.play("run")
transform.localPosition += dir.normalized * speed * Time.deltaTime;
}
else
{
//停下来吃东西的状态
Anim.Play("eat");
}
}
void ChangeState()
{
int value = Random.Range(0, 2);
if(value==0) //停下来
{
isWalk = false;//停止
}
else //继续走
{
if(!isWalk)//如果本来是停下来的鸡,现在变为走动,那就转一下方向
{
dir = new Vector3(Random.Range(-10, 10), Random.Range(-10, 10), 0);
}
isWalk = true;//运动
}
time = 0;//定时器清零
}
现在我的鸡已经可以在鸡圈走走停停,随机的到处跑了,因为动图麻烦,也就懒得上传了……