VR乒乓球项目Unity3D 开发经验整理,4简单而有效的AI

前面的AI费了好大劲也没达到理想效果,本来应该继续写更复杂而NB的AI算法,例如机器学习,后面也肯定要这么做。

不过我突然想到了一个简单有效的方法,先卖个关子,最后给代码。先谈优缺点

优点:

简单,

好理解,

稳定有效,

缺点:

粗暴干预,

并非完全仿真,

回球不符合直觉,无法预判

方法:

在球的OnCollisionExit方法上做操作,碰撞结束后让球自己朝落点飞过去。

类似于对方开挂让球百发百中,己方也可以这样改。

private void OnCollisionExit(Collision collision)
    {
        if (collision.gameObject.name.Equals("Racket (1)"))
        {
            AI2(this.transform.position, aim.transform.position, aim2.transform.position);
        }
        if (collision.gameObject.name.Equals("Racket"))
        {
            AI2(this.transform.position, aim.transform.position, aim2.transform.position);
        }
    }
    public void AI2(Vector3 collisionPoint, Vector3 aim, Vector3 aim2)
    {
        if(collisionPoint.z<0)
        {
            aim = aim2;
        }
            float x2 = collisionPoint.x;
            float y2 = collisionPoint.y;
            float z2 = collisionPoint.z;
            float x1 = aim.x;
            float y1 = aim.y;
            float z1 = aim.z;
            //float c = UnityEngine.Random.Range(2.0f,5.0f);
            float c = height;
            Vector3 v22 = calcLine(x1, y1, z1, x2, y2, z2, c);
            this.GetComponent<Rigidbody>().velocity = v22;
      
    }

双方都这么写的,基本达到了神仙打架的效果,然而还是有击球失误的时候。

如果对深入的科学没什么兴趣,到现在的代码就可以做一个3D VR 乒乓球 游戏 了。

后面加上计分系统和参数配置部分,例如玩法设置,难度设置,落点范围设置,过网高度设置,球桌弹性设置,球拍弹性设置,球拍重量设置。

当然,我下一篇还是讨论怎么用机器学习写一个AI

猜你喜欢

转载自blog.csdn.net/u010752777/article/details/108284912