gpt4 book ai didi

c# - 为什么玩家在移动位置后会倒下?

转载 作者:行者123 更新时间:2023-11-30 15:13:58 25 4
gpt4 key购买 nike

我制作了一个带有反射的玻璃杯。这个想法是当玩家靠近 window 时看到玩家反射,就像玩家在看 window 一样。

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

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

Glass

这是播放器屏幕截图。玩家有一个 child 名字 NAVI。 NAVI 位于玩家前方一点:玩家有一个刚体。在左侧的屏幕截图中,NAVI 对象和右侧的播放器 Inspector 设置:

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 方法时,它会将玩家定位到尽可能靠近窗口的位置,以便在玻璃上看到玩家的倒影。

但相反,玩家正在从地板上掉下来,并且不停地掉下去。

最佳答案

您正在使用窗口的本地位置来设置播放器的本地位置。相反,使用 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;

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

关于c# - 为什么玩家在移动位置后会倒下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56602568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com