繁体   English   中英

Transform.position 不移动 object 到给定的 Vector3 position

[英]Transform.position not moving object to the given Vector3 position

我编写了一个代码来更新对象的位置,它运行良好,直到我添加了一个新部分来移动其他批次的同类对象。

对象没有移动到给定的Vector3 position,所以我检查了我给他们的向量; 他们应该被转移到position。 我什至检查了指定的 position 和当前 position 之间的距离; 他们从未达到0。

我检查了他们是否被卡住了。 他们没有刚体,也不是任何其他对象的孩子,所以我不认为是这样,我是对的。 即使在检查器中强行将其位置更改为正确的位置,它们仍会不断移回错误的 position。

我不知道这怎么会发生。 这是我写的代码部分。

public void UpdateCardPosition(int offsetDirection)
{
    TimeBehaviour centralTime = FindObjectOfType<TimeBehaviour>();
    float AnchorDistance = centralTime.GetBoardSize() * 4.5f;
    float ManifestRepulsion = 0f;
    int playerIndex = centralTime.PlayerList.IndexOf(this);
    
    if (FocalEntity != null) ManifestRepulsion = AnchorDistance * 5;
    
    foreach (EntityBehaviour entity in FindObjectsOfType<EntityBehaviour>())
    {
        float em_count = entity.entityManifests.Count;
        for(int i=0; i<em_count; i++)
        {
            CardBehaviour curCard = entity.entityManifests[i];
            if (curCard != centralTime.FocalEvent)
            {
                float theta = Mathf.PI / 2 * (((float)i + 1) / (em_count + 1) - .5f);
                Vector3 newLoc = new Vector3(AnchorDistance * (.5f - playerIndex) / .5f * Mathf.Cos(theta), AnchorDistance*5, AnchorDistance * (.5f - playerIndex) / .5f * Mathf.Sin(theta));
                if (entity == FocalEntity) newLoc = new Vector3(AnchorDistance * (.5f - playerIndex) / .5f * Mathf.Cos(theta), 0f, AnchorDistance * (.5f - playerIndex) / .5f * Mathf.Sin(theta));
                curCard.transform.position = Vector3.Lerp(curCard.transform.position, newLoc, 0.1f);
                // Debug.Log((curCard.transform.position-newLoc).magnitude);
                curCard.transform.rotation = Quaternion.Euler(new Vector3(0, (90f * (.5f - playerIndex) / .5f - theta * 180 / Mathf.PI), 0));
            }
            else
            {
                curCard.transform.position = Vector3.Lerp(curCard.transform.position, centralTime.transform.position, 0.1f);
                curCard.transform.rotation = Quaternion.Slerp(curCard.transform.rotation, centralTime.transform.rotation, 0.1f);
            }
        }
    }
    
    // These Sections Under this Comment works properly, and they are written in the same way as above.
    float pre_count = playerPresent.Count;
    for (int i=0; i<pre_count; i++)
    {
        float AnchorDistance_Pre = AnchorDistance + 1.5f* AnchorDistance * 0.5f * Mathf.Max(0, Mathf.Abs(offsetDirection));
        CardBehaviour curCard = playerPresent[i];
        if(curCard != centralTime.FocalEvent)
        {
            float theta = Mathf.PI / 2 * (((float)i + 1) / (pre_count + 1) - .5f) + offsetDirection * Mathf.PI / 2;
            Vector3 newLoc = new Vector3(AnchorDistance_Pre * (.5f - playerIndex) / .5f * Mathf.Cos(theta), ManifestRepulsion, AnchorDistance_Pre * (.5f - playerIndex) / .5f * Mathf.Sin(theta));
            curCard.transform.position = Vector3.Lerp(curCard.transform.position, newLoc, 0.1f);
            curCard.transform.rotation = Quaternion.Euler(new Vector3(0, (90f * (.5f - playerIndex) / .5f - theta * 180 / Mathf.PI), 0));
        }
        else
        {
            curCard.transform.position = Vector3.Lerp(curCard.transform.position, centralTime.transform.position, 0.1f);
            curCard.transform.rotation = Quaternion.Slerp(curCard.transform.rotation, centralTime.transform.rotation, 0.1f);
        }
    }
    
    float fut_count = playerFuture.Count;
    for (int i = 0; i < fut_count; i++)
    {
        float AnchorDistance_Fut = AnchorDistance + 1.5f* AnchorDistance * (Mathf.Min(-0.5f, offsetDirection) + 1f);
        CardBehaviour curCard = playerFuture[i];
        float theta = Mathf.PI / 2 * (((float)i + 1) / (fut_count + 1) - .5f) + Mathf.PI/2 + offsetDirection * Mathf.PI/2;
        Vector3 newLoc = new Vector3(AnchorDistance_Fut * (.5f - playerIndex) / .5f * Mathf.Cos(theta), ManifestRepulsion, AnchorDistance_Fut * (.5f - playerIndex) / .5f * Mathf.Sin(theta));
        curCard.transform.position = Vector3.Lerp(curCard.transform.position, newLoc, 0.1f);
        curCard.transform.rotation = Quaternion.Euler(new Vector3(0, (90f * (.5f - playerIndex) / .5f - theta * 180 / Mathf.PI), 0));
    }
    
    float pas_count = playerPast.Count;
    for (int i = 0; i < pas_count; i++)
    {
        float AnchorDistance_Pas = AnchorDistance + 1.5f* AnchorDistance * Mathf.Abs(Mathf.Max(0.5f, offsetDirection)-1f);
        CardBehaviour curCard = playerPast[i];
        float theta = Mathf.PI / 2 * (((float)i + 1) / (pas_count + 1) - .5f) - Mathf.PI / 2 + offsetDirection * Mathf.PI/2;
        Vector3 newLoc = new Vector3(AnchorDistance_Pas * (.5f - playerIndex) / .5f * Mathf.Cos(theta), ManifestRepulsion, AnchorDistance_Pas * (.5f - playerIndex) / .5f * Mathf.Sin(theta));
        curCard.transform.position = Vector3.Lerp(curCard.transform.position, newLoc, 0.1f);
        curCard.transform.rotation = Quaternion.Euler(new Vector3(0, (90f * (.5f - playerIndex) / .5f - theta * 180 / Mathf.PI), 0));
    }   
}

您想将游戏 object 移动到目标位置,在这种情况下,如果您使用 Vector3.Lerp。 我认为它不会立即改变 position 而是以预定义的速度移动。 如果是这种情况,导致 object 移动的脚本处于if(curCard.= centralTime.FocalEvent)的条件下,并且此条件处于另一个条件foreach (EntityBehaviour entity in FindObjectsOfType<EntityBehaviour>())条件下。 我的猜测是,由于在满足任何条件时转换需要时间,因此导致 object 移动的代码将不再执行。 即使if(curCard.= centralTime.FocalEvent)仍然正确,但如果 foreach 条件完成,它下面的代码将不再执行。 如果您说第二部分运行正常,我猜有问题的部分和有效的部分之间的区别是foreach

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM