统一球同步
Unity Ball Synchronization
我正在编写一个动画球多人手机游戏。小球动画相当快(速度在25-30左右)而且有多个小球。
最初,我尝试在 masterclient 上 运行 物理并通过网络在客户端同步。不过客户端的小球动画不是很流畅,会降低玩家的欢乐度。
其次,我尝试 运行 每个客户端上的每个物理分别具有以下功能,但是,物理模拟在 android 和 unity 编辑器之间是不同的。
最后,我该怎么办?
Rigidbody rb;
float t1 = 0.0f;
float t2 = 0.0f;
float scale = 2f;
float maxVelocity = 20f;
bool collided = false;
float limitSpeed = 30f;
float cooldown = 1;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void InitialKick()
{
switch (GameObject.Find("GameManager").GetComponent<GameManager>().ballCount)
{
case 1:
rb.AddForce(new Vector3(20, 0f, 20), ForceMode.Force);
break;
case 2:
rb.AddForce(new Vector3(-20, 0f, 20), ForceMode.Force);
break;
case 3:
rb.AddForce(new Vector3(20, 0f, -20), ForceMode.Force);
break;
case 4:
rb.AddForce(new Vector3(-20, 0f, -20), ForceMode.Force);
break;
case 5:
rb.AddForce(new Vector3(10, 0f, 30), ForceMode.Force);
break;
case 6:
rb.AddForce(new Vector3(-10, 0f, 30), ForceMode.Force);
break;
case 7:
rb.AddForce(new Vector3(10, 0f, -30), ForceMode.Force);
break;
case 8:
rb.AddForce(new Vector3(-10, 0f, -30), ForceMode.Force);
break;
case 9:
rb.AddForce(new Vector3(30, 0f, 10), ForceMode.Force);
break;
case 10:
rb.AddForce(new Vector3(-30, 0f, 10), ForceMode.Force);
break;
}
}
private void FixedUpdate()
{
if (!collided) InitialKick();
if (collided & rb.velocity.magnitude < maxVelocity) rb.AddForce(3f * scale * rb.velocity.normalized, ForceMode.Force);
t1 += Time.deltaTime;
if (t1 > 1.0f)
{
scale += 0.5f;
t1 = 0.0f;
}
t2 += Time.deltaTime;
if (t2 > 10.0f)
{
if (maxVelocity < 40f) maxVelocity++;
t2 = 0.0f;
}
rb.mass += Time.deltaTime * 0.01f;
}
private void OnCollisionEnter(Collision collision)
{
if (collision.collider.tag == "Wall" || collision.collider.tag == "Column")
{
collided = true;
}
}
}
我会做的是在 masterclient 上计算物理(例如动画中的球位置列表)。
主客户端将计算结果发送给每个客户端。
最终,每个客户都会根据结果创建一个动画。
我正在编写一个动画球多人手机游戏。小球动画相当快(速度在25-30左右)而且有多个小球。
最初,我尝试在 masterclient 上 运行 物理并通过网络在客户端同步。不过客户端的小球动画不是很流畅,会降低玩家的欢乐度。
其次,我尝试 运行 每个客户端上的每个物理分别具有以下功能,但是,物理模拟在 android 和 unity 编辑器之间是不同的。
最后,我该怎么办?
Rigidbody rb;
float t1 = 0.0f;
float t2 = 0.0f;
float scale = 2f;
float maxVelocity = 20f;
bool collided = false;
float limitSpeed = 30f;
float cooldown = 1;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void InitialKick()
{
switch (GameObject.Find("GameManager").GetComponent<GameManager>().ballCount)
{
case 1:
rb.AddForce(new Vector3(20, 0f, 20), ForceMode.Force);
break;
case 2:
rb.AddForce(new Vector3(-20, 0f, 20), ForceMode.Force);
break;
case 3:
rb.AddForce(new Vector3(20, 0f, -20), ForceMode.Force);
break;
case 4:
rb.AddForce(new Vector3(-20, 0f, -20), ForceMode.Force);
break;
case 5:
rb.AddForce(new Vector3(10, 0f, 30), ForceMode.Force);
break;
case 6:
rb.AddForce(new Vector3(-10, 0f, 30), ForceMode.Force);
break;
case 7:
rb.AddForce(new Vector3(10, 0f, -30), ForceMode.Force);
break;
case 8:
rb.AddForce(new Vector3(-10, 0f, -30), ForceMode.Force);
break;
case 9:
rb.AddForce(new Vector3(30, 0f, 10), ForceMode.Force);
break;
case 10:
rb.AddForce(new Vector3(-30, 0f, 10), ForceMode.Force);
break;
}
}
private void FixedUpdate()
{
if (!collided) InitialKick();
if (collided & rb.velocity.magnitude < maxVelocity) rb.AddForce(3f * scale * rb.velocity.normalized, ForceMode.Force);
t1 += Time.deltaTime;
if (t1 > 1.0f)
{
scale += 0.5f;
t1 = 0.0f;
}
t2 += Time.deltaTime;
if (t2 > 10.0f)
{
if (maxVelocity < 40f) maxVelocity++;
t2 = 0.0f;
}
rb.mass += Time.deltaTime * 0.01f;
}
private void OnCollisionEnter(Collision collision)
{
if (collision.collider.tag == "Wall" || collision.collider.tag == "Column")
{
collided = true;
}
}
}
我会做的是在 masterclient 上计算物理(例如动画中的球位置列表)。 主客户端将计算结果发送给每个客户端。 最终,每个客户都会根据结果创建一个动画。