Unity - 在GetComponent上传递更新vector3以移动对象

时间:2016-05-17 12:57:27

标签: c# unity3d transform

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)
  • 如何正确传递这些值
  • 如何确认它们是否为vector3格式

感谢您的回答。

2 个答案:

答案 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;
}