为什么玩家移动其位置后会掉下来?

时间:2019-06-14 17:09:13

标签: c# unity3d

我用反射创建了玻璃。 这个想法是当玩家靠近窗户时看到玩家在窗户上看时的倒影。

玻璃反射正在起作用,并且在层次结构中已禁用。我稍后将在游戏中启用玻璃反射。

这是玻璃打开时的屏幕截图: 我将玻璃杯放在窗户上:

Glass

这是播放器的屏幕截图。播放器的子名称为NAVI。 NAVI位于播放器的前方: 玩家有一个刚体。在左侧NAVI对象的屏幕截图中,以及在播放器检查器设置右侧的屏幕截图中:

Player

此脚本不是固定在玻璃上,而是固定在玻璃上:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ItemAction : MonoBehaviour
{
    public RotateCamera rotatecamera;
    public GameObject glass;
    public GameObject player;

    public void Init()
    {
        player.transform.localPosition = new Vector3(transform.localPosition.x - 1, transform.localPosition.y, transform.localPosition.z);
        glass.SetActive(true);
    }
}

这是窗口的屏幕截图,其中附带了脚本:

Window

这个想法是,当在游戏中某个地方调用Init方法时,它将使玩家尽可能靠近窗户,从而看到玩家在玻璃板上的反射。

但是相反,玩家是从地板上掉下来并保持不间断的跌倒。

1 个答案:

答案 0 :(得分:4)

您正在使用窗口的本地位置来设置播放器的本地位置。而是使用position并仅更改播放器的x分量:

float paddingDistance = 1f;  // Change this to adjust the padding

player.transform.position = new Vector3(transform.position.x - paddingDistance, 
                                        player.transform.position.y, 
                                        player.transform.position.z);

问题是它仅适用于以这种方式旋转的玻璃。如果要在任何这样的玻璃方向上进行此操作,都可以使平面与玻璃平行,但间隔一定距离,然后将播放器移到该平面上的最近点。假设玻璃垂直于其transform.left方向:

float paddingDistance = 1f;  // Change this to adjust the padding
Vector3 paddingPoint = transform.position + transform.left * paddingDistance; 
float paddingToPlayerAlongLeft = Vector3.Dot(transform.left,
                                                 player.transform.position - paddingPoint);

// closest point to player.transform.position on padding plane
player.transform.position = player.transform.position 
                            - paddingToPlayerAlongLeft * transform.left;

但是,即使这仅适用于玻璃的一侧。如果要在玻璃的任一侧进行此操作,则需要确定播放器是否在左侧(我们可以使用Vector3.Dot进行此操作),然后按照相应的方向制作平面:< / p>

float paddingDistance = 1f;// Change this to adjust the padding

float glassToPlayerAlongLeft = Vector3.Dot(player.transform.position - transform.position, 
                                         transform.left);

float paddingLeftMod = glassToPlayerAlongLeft > 0f ? 1f : -1f;

float paddingToPlayerAlongLeft = glassToPlayerAlongLeft - paddingDistance * paddingLeftMod;

// closest point to player.transform.position on padding plane
player.transform.position = player.transform.position 
                            - paddingToPlayerAlongLeft * transform.left;

但是,只有在玻璃完全垂直的情况下,这才有效。如果玻璃不是总是垂直的,那么您可以找到玩家高度处水平面与填充平面的线相交点,然后将玩家位置设置为该线上的最接近点