【问题标题】:Why the player is falling down after moving it's position?为什么玩家移动位置后会摔倒?
【发布时间】:2019-06-15 06:34:34
【问题描述】:

我创建了一个带反射的玻璃。 这个想法是当玩家靠近一个窗口时,可以看到玩家的反射,就像玩家在看窗口一样。

玻璃反射正在工作,它在层次结构中被禁用。我将在游戏后期启用玻璃反射。

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

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

而且这个脚本不是贴在玻璃上而是贴在窗户上的:

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);
    }
}

这是附有脚本的窗口截图:

这个想法是,当游戏中的某个地方调用 Init 方法时,它会将玩家定位在尽可能靠近窗口的位置,以查看玩家在玻璃上的反射。

但相反,玩家从地板上摔下来,不停地摔倒。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您正在使用窗口的本地位置来设置播放器的本地位置。相反,使用 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 来做到这一点),然后使平面朝着相应的方向:

    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;
    

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

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-25
      • 2021-12-30
      相关资源
      最近更新 更多