VR乒乓球项目Unity3D 开发经验整理,2代码

上一篇搭了游戏场景,完全没提代码。因为图形化的部分足够模拟一个世界。

下面是编码,其实控制部分的代码少的可怜,重点全在AI上,计分系统量也不少,但我认为那是细枝末节。

private void FixedUpdate()
    {
        //racket2.GetComponent<Rigidbody>().MovePosition(controller0.transform.position);
        //racket2.GetComponent<Rigidbody>().MoveRotation(controller0.transform.rotation*Quaternion.Euler(90,0,0));
        racket2.GetComponent<Rigidbody>().MovePosition(Pvr_UnitySDKAPI.Controller.UPvr_GetControllerPOS(0)+ground.transform.position);
        racket2.GetComponent<Rigidbody>().MoveRotation(Pvr_UnitySDKAPI.Controller.UPvr_GetControllerQUA(0) * Quaternion.Euler(90, 0, 0));
    }

很简单,球拍就和手柄一起动了,这里要划重点:

1.不能直接给transform赋值,那样的效果类似瞬移,没有速度,球拍只有静态反弹。

2.不能直接给transform赋值,racket2.GetComponent<Rigidbody>().position也不行,在球拍移动速度过快的时候会直接穿过乒乓球,没有碰撞。

3.不能直接作为SDK->Prefabs->controller的子物体,因为你不知道prefab是怎么控制controller移动的,如果是直接给transform赋值的方法就坑了。

4.没从controller读位置是因为prefab也是从SDK读的位置,经过prefab转了一手可能影响速度,不好测试,一般也感受不到,只是出于习惯。

5.要放在FixedUpdate里,因为遵从别人的建议,固定时间执行产生的位移效果等更真实。个人感觉无所谓,因为我们不是固定速度位移,而是追踪手柄位置按实际情况移动。但担心出问题,还是按建议写在FixedUpdate里。另外,因为是VR游戏,帧率会比较高,如果FixUpdate比Update执行的少就尴尬了,默认0.02秒,50Hz,不够。

    public void OnGameReady()//对方发球
    {        
        GameObject.Destroy(g1);
        g1 = GameObject.Instantiate(ball);
        g1.transform.position = racket.transform.position+new Vector3(0,0,-0.1f);//初始化在球拍前方一点的位置,不然会从球拍中间出来,发生奇怪的碰撞。
        g1.SetActive(true);
        g1.GetComponent<Rigidbody>().AddForce(UnityEngine.Random.Range(-force2, force2), 0, force);//一个向前的力,和一个向两侧的力,注意力度,别超过桌子了
}

以上,上一篇缺的代码就补齐了,可以练习接发球了。

下面是AI设计,我刚做了一半,一边做一边写。首先是最简单的AI,

racket.GetComponent<Rigidbody>().MovePosition(new Vector3(v.x, v.y, racket0.transform.position.z));
racket.GetComponent<Rigidbody>().MoveRotation(Quaternion.LookRotation(Vector3.back, Vector3.up));
        

拍随着球上下左右移动,保证能打到球,但是能不能打回去就看运气了,通常情况下运气不太好。

猜你喜欢

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