unity2D让游戏物体在不规则范围内随机移动

整体思路是,利用polygon collider 2D做了一个边缘的触发器,但是如果只是让游戏物体触碰到边缘后,随机改变方向,或者仅仅只是方向取反,会造成下列一些极限情况。
比如随机取一个方向,就直接从边缘朝外面移动了,这里如果说给一个随机方向的范围,但因为是不规则边缘,那么很有可能一开始游戏物体的运动方向和边缘的切线就只有10°,或者更小,那么无论怎样都会有个极限情况,让游戏物体飞到了外界。
如果取反的话,会看着游戏物体非常的僵硬。
下面我要做的就是让鸡在鸡圈中随机移动,并且不会移动到鸡圈外。
unity2D让游戏物体在不规则范围内随机移动_第1张图片
第一步,加一个polygon检测器
unity2D让游戏物体在不规则范围内随机移动_第2张图片
按照你想要的区域,把它勾出来即可

第二步,加几个随机点,这在后面,判断碰到碰撞器的时候有用。
注意随机点最好几个方向都有一个,并且要放在边缘碰撞检测的里面。
unity2D让游戏物体在不规则范围内随机移动_第3张图片

第三步,给挂有边缘检测的gameobject加一个脚本
用来判断,当游戏物体从检测器中离开的时候,该怎么做。

  private void OnTriggerExit2D(Collider2D collision)
    {
        int temp= Random.Range(0, ChickenPenManage.instance.spawns.Length);//在第二步的随机点中随机选一个出来
        while(temp==collision.gameObject.GetComponent().index)//这个随机点和前一个随机点不能相同,如果相同的话,就会直接出边界了。
        {
            temp = Random.Range(0, ChickenPenManage.instance.spawns.Length);
        }
        collision.gameObject.GetComponent().dir = ChickenPenManage.instance.spawns[temp].position-collision.transform.position;//给游戏物体一个到随机点的方向,这个方向就是它接下来的运动方向。
        collision.gameObject.GetComponent().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();
        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;//定时器清零
    }

现在我的鸡已经可以在鸡圈走走停停,随机的到处跑了,因为动图麻烦,也就懒得上传了……

你可能感兴趣的:(unity)