将枪定位在恒定的位置

时间:2018-05-01 19:39:49

标签: c# unity3d

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

enter image description here

但是当我尝试使用播放器定位并旋转它时,我遇到了问题。枪不能很好地旋转,并且总是没有相同的位置。

有没有办法将枪保持在同一位置并使其与播放器一起旋转?

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

这是我尝试使用的代码:

myObject['prop1.prop2.prop3']

3 个答案:

答案 0 :(得分:2)

好的,这是我答应的答案:

第一个问题是你如何设置轮换,SetLookRotation接受2个参数,Vector3 viewVector3 up第二个参数默认为Vector3.up。您正在传递player.transform.position,用于"视图"这是你想要变换的方向。想象一下,如果我向东朝西,我的武器将面向东方......(假设SetLookRotation将它标准化。)这是因为我的实际位置是东,来自一些武断的起源。您可以使用的东西是player.transform.forward

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

在评论中,我说给自己一个offsetPosition和一个eulerAngle,但如果你有多个武器,这可能会很麻烦。我提到我会建议我如何为多种武器设置这个...所以这里是的。

可编写脚本的对象,

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

using UnityEngine;
using System.Collections;

[CreateAssetMenu(fileName = "New Weapon", menuName = "Weapon")]    
public class WeaponObject : ScriptableObject {
    public string objectName = "New Weapon";
    public Vector3 offSetPosition;
    public Vector3 startOffsetRotation;
    public float fireRate;
    // Using a gameObject to store the weapon model so you can technical
    // store the firing point.
    public GameObject weaponModel;  
}

您现在可以通过右键单击资产目录并转到create-> weapon来创建新对象。完成此操作后,您可以重命名它所创建的对象,检查器将显示您可以修改的此对象的所有公共字段。

通过这种方法,您可以创建多种武器,并像WeaponManager一样存储数据,从而生成每种武器。有类似的东西:

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

答案 1 :(得分:1)

playerGuns[keyPress].transform.parent = Player.transform;

此行可能会导致问题。如果你正在向玩家变换你的枪,那么它将跟随玩家。但听起来你想要它跟着相机?

尝试:

 playerGuns[keyPress].transform.parent = Camera.main.transform;

答案 2 :(得分:0)

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

许多游戏会在绘制枪模型之前清除深度缓冲区。 这样可以防止枪模型穿过几何体,但是 站在墙附近会显得有些奇怪: but it
can look a bit weird when standing near a wall.

如果只想渲染粘贴在相机上的对象,则应该 只是摆脱视图矩阵(假设您使用模型,视图, 和投影矩阵。

说明:通常,当您使用视图矩阵(相机矩阵)时,场景中的对象相对于相机位置矢量的大小进行平移,并通过其偏航和俯仰旋转,从而产生了幻觉。在3D空间中移动的摄影机,但实际上并没有摄影机,只是场景中的对象会根据为摄影机定义的值缩放和转换。

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