Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 把枪放在固定的位置_C#_Unity3d - Fatal编程技术网

C# 把枪放在固定的位置

C# 把枪放在固定的位置,c#,unity3d,C#,Unity3d,我试着按照大多数fps游戏的定位方式来定位我的枪, 例如: 但是当我试图和球员一起定位和旋转它时,我遇到了一个问题。枪旋转不好,位置也不总是一样的 有没有办法让枪保持在同一个位置,让它和玩家一起旋转 但我的主要问题是枪的位置,我需要它停留在一个地方,就像在每一个fps,当我开始游戏,并选择一支枪,它产卵在屏幕上不同的位置,因为旋转 以下是我尝试使用的代码: GameObject temp = GameObject.Find(gameObject.name); playerGuns[keyPre

我试着按照大多数fps游戏的定位方式来定位我的枪, 例如:

但是当我试图和球员一起定位和旋转它时,我遇到了一个问题。枪旋转不好,位置也不总是一样的

有没有办法让枪保持在同一个位置,让它和玩家一起旋转

但我的主要问题是枪的位置,我需要它停留在一个地方,就像在每一个fps,当我开始游戏,并选择一支枪,它产卵在屏幕上不同的位置,因为旋转

以下是我尝试使用的代码:

GameObject temp = GameObject.Find(gameObject.name);
playerGuns[keyPress] = Instantiate(temp, Player.transform.position 
                       + new Vector3(-2f, 3f, 4f), Quaternion.identity) as GameObject;
playerGuns[keyPress].name = gameObject.name;
playerGuns[keyPress].tag = gameObject.tag;
playerGuns[keyPress].transform.parent = Player.transform;
playerGuns[keyPress].transform.rotation.SetLookRotation(Player.transform.position);
此线路可能会导致问题。如果你把你的枪教给玩家,那么它就会跟着玩家。但听起来你想让它跟着摄像机走

尝试:


好吧,这是我承诺的答案:

第一个问题是如何设置旋转,
SetLookRotation
接受两个参数,
Vector3视图
,以及
Vector3 up
第二个问题默认为
Vector3.up
。您正在传递player.transform.position,用于“视图”,这是您希望transform查看的方向。这样想吧,如果我是远东面向西方,我的武器将面向东方。。。(这是假设SetLookRotation将其标准化。)这是因为我的实际位置是从某个任意原点向东。您本可以使用的是
player.transform.forward

要生成对象并使其具有相同的相对旋转和位置,可以像在原始代码中一样使用
实例化
。有几个版本的

在我的评论中,我说给自己一个补偿和一个赞扬,但如果你有多个武器,这会很麻烦。我说过我会给你一个建议,我将如何设置多个武器。。。好了,走吧


可编写脚本的对象

在Unity中,您可以创建此对象来存储有关特定对象的信息,例如,“武器”对象可以如下所示:

使用UnityEngine;
使用系统集合;
[CreateAssetMenu(fileName=“新建武器”,menuName=“武器”)]
公共类武器对象:ScriptableObject{
公共字符串objectName=“新武器”;
公共矢量3偏置位置;
公共向量机3开始跟踪;
公共浮式灭火器;
//使用游戏对象存储武器模型,以便您可以
//储存射击点。
公共游戏对象武器模型;
}
你现在可以通过右键点击你的资产目录并进入创建->武器来创建一个新的对象。完成此操作后,您可以重命名它创建的对象,并且检查器将显示您可以修改的此对象的所有公共字段

有了它,你可以创建多种武器,并像武器管理器一样将它们的数据存储在中,从而生成每种武器。比如:

WeaponObject weapon = WeaponManager.getWeapon(keyPress);
playerGuns[keyPress] = Instantiate(weapon.weaponModel, Player.transform.position + weapon.offsetPosition, Quaternion.identity) as GameObject;
playerGuns[keyPress].name = weapon.objectName;
playerGuns[keyPress].transform.parent = Player.transform;
playerGuns[keyPress].transform.eulerAngles = weapon.startOffsetRotation;
if(player.weaponScript != null) {
   // we can have a single script for all of our weapons, and the WeaponObject
   // will control its firerate, which projectiles it fires, etc.
   player.weaponScript.setWeapon(weapon);
}

以下是reddit用户Mathias9807提供的有用答案:

许多游戏会在绘制枪模型之前清除深度缓冲区。 这将阻止枪模型剪切几何体,但是 站在墙边时可能看起来有点奇怪:

如果只想渲染粘附在摄影机上的对象,则应 只要去掉视图矩阵(假设您使用的是模型-视图)- 和投影矩阵)

说明:通常在使用视图矩阵(摄影机矩阵)时,场景中的对象相对于摄影机位置向量的大小进行平移,并通过其偏航和俯仰旋转,这会产生摄影机在三维空间中移动的错觉,但实际上没有摄影机,只有场景中缩放的对象,并相对于为摄影机定义的值进行平移


因此,当删除对象的摄影机矩阵时,摄影机位置现在对模型位置没有影响,换句话说,模型不再相对于相机移动,而是与相机一致移动。

将枪作为玩家游戏对象的一部分,当你旋转玩家对象时,枪将始终与其一起旋转。是的。。但立场仍然是问题所在。尽管有这么多评论,我认为没有人理解你的问题。你介意提供一个指向该问题的gif或视频的链接吗?好的,现在让我们创建一个公共矢量3,并将旋转设置为类似于
playerGuns[keyPress].transform.eulerAngles=determineEulerRotation仅当您第一次创建武器时才执行此操作。执行与旋转相同的操作,但将向量命名为偏移向量,然后在创建时,而不是执行
Player.transform.position+新向量3(-2f,3f,4f)
do
Player.transform.position+offset
我回家后会写一个答案,解释问题和我对不同武器类型执行类似操作的“建议”…在FPS中,摄像机和播放器通常处于同一位置,可能是相同的变换……是的,我假设是这样,但听起来Netanel的问题是基于旋转的?例如,如果他的角色是向左扫射,理想的行为是让枪保持向前。但是,它可能会跟随玩家对象“向前”并面向左侧。我本以为在3D FPS中,相机会是一个更好的家长。这取决于玩家角色控制器的结构。如果我们能看到一个问题的例子,那就容易多了。同样的论点也适用,球员的旋转通常与摄像机相同,如果他们不是相同的变换。。。除非你知道一个FPS的相机和播放器不是同一个变换?如果你是扫射左。。。你仍然面对着你向左移动的同一个前进方向。(让我们不要把变换。前进与我们的速度方向混淆)啊,是的,我明白你的意思。我
 playerGuns[keyPress].transform.parent = Camera.main.transform;
WeaponObject weapon = WeaponManager.getWeapon(keyPress);
playerGuns[keyPress] = Instantiate(weapon.weaponModel, Player.transform.position + weapon.offsetPosition, Quaternion.identity) as GameObject;
playerGuns[keyPress].name = weapon.objectName;
playerGuns[keyPress].transform.parent = Player.transform;
playerGuns[keyPress].transform.eulerAngles = weapon.startOffsetRotation;
if(player.weaponScript != null) {
   // we can have a single script for all of our weapons, and the WeaponObject
   // will control its firerate, which projectiles it fires, etc.
   player.weaponScript.setWeapon(weapon);
}