Unity3D版本4.5.3f3 Pro。
我是Unity和C#的新手,我很难理解为什么我的对象没有更新(移动)到我尝试发送的新Vector3值。
背景:我使用套接字将3个值的数组传入统一。在执行Debug.Log数据时,我收到的值很好。数据在每秒递增的设定时间内更新(即"位置":" -10,10,10和#34;后一秒"位置":&#34 ; -11,11,11"依此类推)
我一直在努力理解Vector3,但我已经想出了这个。
使用脚本的空对象:
public void PlayerMove(SocketIOEvent e)
{
Debug.Log("e.data: " + e.data);
string newVectorString = e.data.ToString ();
Debug.Log("newVectorString: " + newVectorString);
string[] temp = newVectorString.Split(',');
float x = float.Parse(temp[0]);
float y = float.Parse(temp[1]);
float z = float.Parse(temp[2]);
Vector3 newPosition = new Vector3(x,y,z);
otherPlayer.GetComponent<OtherPlayer>().startPosition = newPosition;
}
两个日志(不断更新)的结果是:
e.data: {"Position":"-19,19,0"}
UnityEngine.Debug:Log(Object)
和
newVectorString: {"Position":"-19,19,0"}
UnityEngine.Debug:Log(Object)
所以我正在接收数据!我已将其移动到字符串&new; newVectorString&#39;中。然后我尝试通过拆分字符串并将其传递到GetComponent上来创建一个新的向量,如下所示...
otherPlayer.GetComponent<OtherPlayer>().startPosition = newPosition;
下一部分。
对象&#34; otherPlayer&#34;使用脚本&#39; OtherPlayer.cs&#39;:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class OtherPlayer : MonoBehaviour
{
public Vector3 startPosition;
public Vector3 currentPosition = Vector3.zero;
void Start ()
{
}
void Update ()
{
Debug.Log("Is there anybody out there??: " + startPosition.ToString ());
if (startPosition != Vector3.zero)
{
currentPosition = startPosition;
startPosition = Vector3.zero;
transform.position = Vector3.Lerp (transform.position, currentPosition, 50 * Time.deltaTime);
}
else
{
transform.position = Vector3.Lerp (transform.position, currentPosition, 50 * Time.deltaTime);
}
}
}
最新Debug&#39; startPosition.ToString()&#39;的结果:
Is there anybody out there??: (0.0, 0.0, 0.0)
UnityEngine.Debug:Log(Object)
感谢您的回答。
答案 0 :(得分:1)
Vector3 vec = otherPlayer.position;
这会将position的值复制到vec中。现在你有两个独立的副本。改变一个不会影响另一个。
您需要在OtherPlayer中保留对PlayerMove的引用并跟踪位置的变化。
public class OtherPlayer : MonoBehaviour{
private OtherScript script= null;
private void Start(){
this.script= GetOtherScript(); // you should know how to get it
}
void Update ()
{
Debug.Log("Is there anybody out there??: " + this.script.startPosition.ToString ());
if (startPosition != Vector3.zero)
{
currentPosition = this.script.startPosition;
startPosition = Vector3.zero;
transform.position = Vector3.Lerp (transform.position, currentPosition, 50 * Time.deltaTime);
}
else
{
transform.position = Vector3.Lerp (transform.position, currentPosition, 50 * Time.deltaTime);
}
}
}
不要担心性能,因为高一级或内存,这绝对没有。
编辑:进一步解释原因:
考虑你有一张带有(10,10,10)的纸A,你拿纸B并读取它们并将它们写在纸上B.现在A和B读(10,10,10)。将纸张A更改为(20,20,20),纸张B没有理由自动更改,因此它仍然是(10,10,10)。这就是你在做什么。
Vector3 currentPosition = newPosition;
要解决此问题,请拿纸A并在上面写上(10,10,10),然后将其放在桌面上。拿一张纸O并写上(桌子)。现在拿一张纸W并写上(O,论文B)。 W有一个方法,它将使用O在B上写字。所以它去读取O,O告诉桌面,然后你去桌子并阅读(10,10,10)并在B上写下。一切都很好。< / p>
你更新A到(20,20,20),纸W再次运行该方法,它转到O告诉Desk,你去桌子找到A并读取(20,20,20)并写入在B. Tadaaaa上。它工作正常。你可以看到它有点慢,但没有任何会影响你的表现。这是我告诉要使用的情况。
Vector3 currentPosition = scriptTransform.position;
scriptTransform是纸张O位置是桌面上的纸张A. currentPosition是paperB。 W是OtherPlayer脚本。
答案 1 :(得分:1)
你的OtherPlayer脚本似乎没问题:每当你编辑startPosition时它都会平滑地将gameObject移动到某个位置(虽然你没有以一种非常容易理解的方式命名你的变量:
startPosition
应该像newTargetPosition
currentPosition
这样的targetPosition
transform.Position
始终是对象的确切位置(如果你不清楚的话)
我认为你应该检查:(见评论)
public void PlayerMove(SocketIOEvent e)
{
Debug.Log("e.data: " + e.data);
string newVectorString = e.data.ToString ();
Debug.Log("newVectorString: " + newVectorString);
// CHECK THIS:
// temp[0] is equal to {"Position":"-19 --> Won't parse
string[] temp = newVectorString.Split(',');
float x = float.Parse(temp[0]);
float y = float.Parse(temp[1]);
float z = float.Parse(temp[2]);
Vector3 newPosition = new Vector3(x,y,z);
// Check this: print new position to see if it is correct
// Check if otherPlayer is the object you expect to have here
otherPlayer.GetComponent<OtherPlayer>().startPosition = newPosition;
}