多人游戏中的Unity3D碰撞

时间:2016-02-14 21:22:59

标签: c# unity3d network-programming game-engine

我创造了一个类似火箭联盟的比赛。 我的问题是球。 我写了一个scipt,根据syncvars设置球位置和刚体,服务器每隔0.01秒设置一次。 这很好用。 主机播放器可以触摸球,它也可以在客户端移动。 我的代码有效。 但是当我试图与客户接触球时,问题出现了。 玩家对象会陷入困境,物理学并没有真正发挥作用。 球有时会移动,但它仍然是奇怪的运动。 我想问题是球并没有真正从客户那里获得刚性的变化。

这是我的代码

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class Ball_Behaviour : NetworkBehaviour {

    [SyncVar]
    public Vector3 syncedballpos;
    public Vector3 ballpos;
    [SyncVar]
    public Quaternion syncedballrot;
    public Quaternion ballrot;

    public AudioClip boom;

    [SyncVar]
    public Vector3 syncedballrigvel;
    public Vector3 rigvel;
    [SyncVar]
    public Quaternion syncedballrigrot;
    public Quaternion rigrot;

    public GameObject ball;
    public Rigidbody rig;
    public AudioSource aud;
    public GameObject pat;

    public float offset;
    // Use this for initialization
    override
    public float GetNetworkSendInterval()
    {
        return 0.015f;
    }

    void Start () {
        aud = GetComponent<AudioSource>();
        GetNetworkSendInterval();
        ball = this.gameObject;
        rig = GetComponent<Rigidbody>();
        offset = 1;
    }

    // Update is called once per frame
    void Update ()
    {
        if (isServer)
        {
            setball();
        }

        if (Vector3.Distance(rigvel, syncedballrigvel) > offset)
        {
            rig.velocity=Vector3.Lerp(rigvel, syncedballrigvel, 1f)*Time.deltaTime*0.05f;
        }
        else
        {
            if (Vector3.Distance(ballpos, syncedballpos) > offset)
            {
                this.transform.position = Vector3.Lerp(ballpos, syncedballpos, 1f) * Time.deltaTime * 0.05f;
            }
            /* if (Quaternion.Angle(rigrot,syncedballrigrot)>1f)
             {
                 rig.rotation = Quaternion.Slerp(rigrot,syncedballrigrot,0.7f);

             }
             if (Quaternion.Angle(ballrot, syncedballrot) > 1f)
             {
                 this.transform.rotation = Quaternion.Slerp(ballrot, syncedballrot, 0.7f);

             }
             */
        }
    }

    [ServerCallback]
    void setball()
    {
        syncedballrigvel = rig.velocity;
        syncedballrigrot = rig.rotation;

        syncedballpos = this.transform.position;
        syncedballrot = this.transform.rotation;
        // RpcDoOnClient(syncedballpos);
    }
    void OnCollisionEnter(Collision col)
    {
        aud.Play();
    }

    public void scored()
    {
        this.GetComponent<MeshRenderer>().enabled = false;

        Instantiate(pat, this.transform.position, this.transform.rotation);

        aud.PlayOneShot(boom,2);  
    }
}

0 个答案:

没有答案