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