我试图按照大多数fps游戏定位的方式定位我的枪, 例如:
但是当我尝试使用播放器定位并旋转它时,我遇到了问题。枪不能很好地旋转,并且总是没有相同的位置。
有没有办法将枪保持在同一位置并使其与播放器一起旋转?
但是我的主要问题是枪的位置我需要它像每个fps一样停留在一个地方,当我开始游戏并选择一个枪,它在屏幕上的不同位置产生因为旋转。
这是我尝试使用的代码:
myObject['prop1.prop2.prop3']
答案 0 :(得分:2)
好的,这是我答应的答案:
第一个问题是你如何设置轮换,SetLookRotation
接受2个参数,Vector3 view
和Vector3 up
第二个参数默认为Vector3.up
。您正在传递player.transform.position,用于"视图"这是你想要变换的方向。想象一下,如果我向东朝西,我的武器将面向东方......(假设SetLookRotation将它标准化。)这是因为我的实际位置是东,来自一些武断的起源。您可以使用的东西是player.transform.forward
。
要生成一个对象并使其具有相同的相对旋转和位置,您可以使用原始代码中的Instantiate
。 instantiate有几个版本。
在评论中,我说给自己一个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提供的有用答案:
许多游戏会在绘制枪模型之前清除深度缓冲区。 这样可以防止枪模型穿过几何体,但是 站在墙附近会显得有些奇怪:
如果只想渲染粘贴在相机上的对象,则应该 只是摆脱视图矩阵(假设您使用模型,视图, 和投影矩阵。
说明:通常,当您使用视图矩阵(相机矩阵)时,场景中的对象相对于相机位置矢量的大小进行平移,并通过其偏航和俯仰旋转,从而产生了幻觉。在3D空间中移动的摄影机,但实际上并没有摄影机,只是场景中的对象会根据为摄影机定义的值缩放和转换。
因此,当您删除某个对象的摄影机矩阵时,摄影机位置现在对模型位置没有影响,或者换句话说,模型不再相对于摄影机移动,而是与摄影机一致移动。 / p>