所以我对随机数学的C#有点新,我学会了如何制作步枪,手枪等等。但我想学习如何使用光线投射制作霰弹枪,不弹丸。有了raycast,我厌倦了做更多的1次光线投射,但不知道如何使它们随机,所以现在我只是坚持1次光线投射。我想在拍摄时随意传播。这是脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShotGun : MonoBehaviour {
private int pellets = 9;
private float spreadAngle = 10f;
private float damage = 10f;
private float range = 1000f;
private Camera fpsCam;
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
if (Input.GetButtonDown("Fire1"))
{
ShotgunRay();
}
}
private void ShotgunRay()
{
RaycastHit hit;
if (Physics.Raycast(fpsCam.transform.position, fpsCam.transform.forward, out hit, range))
{
Health_Armor target = hit.transform.GetComponent<Health_Armor>();
if (target != null)
{
target.TakeDamage(damage);
}
}
}
}
答案 0 :(得分:3)
多次拍摄:
Vector3 direction = fpsCam.transform.forward; // your initial aim.
Vector3 spread;
spread+= fpsCam.transform.up * Random.Range(-1f, 1f); // add random up or down (because random can get negative too)
spread+= fpsCam.transform.right * Random.Range(-1f, 1f); // add random left or right
// Using random up and right values will lead to a square spray pattern. If we normalize this vector, we'll get the spread direction, but as a circle.
// Since the radius is always 1 then (after normalization), we need another random call.
direction += spread.normalized() * Random.Range(0f, 0.2f);
if (Physics.Raycast(fpsCam.transform.position, direction, out hit, range))
{
// etc...
对于随机性:
if (Physics.Raycast(fpsCam.transform.position, direction, out hit, range))
{
Debug.DrawLine(fpsCam.transform.position, hit.point, green);
}
else
{
Debug.DrawRay(fpsCam.transform.position, direction, range, red);
}
要查看结果,请使用Debug.DrawRay和DrawLine。我们想要包括错过的镜头。
range
DrawLine以绿色绘制(如果命中)实际生命值。错过的镜头以<script type="text/babel">
和红色的长度绘制。
答案 1 :(得分:3)
这将取决于相关霰弹枪的规格。我假设你有一把12号霰弹枪,通常有8个弹丸。为此,您需要8个单独的光线投射,以及8个不同的&#34;命中&#34;对象。在大约25码处,一个标准的12号炮弹的直径大约为40英寸,它的有效射程(在它减速太大而不会伤到任何东西之前的范围)大约是125码。这不是绝对的,但它可以让您大致了解您的目标。
所以,在伪代码中,我会创建8个光线投射,每个光线投射都有它自己各自的&#34;命中&#34;宾语。所有的光线投影应该有114.3个单位(统一使用米作为其测量单位,所以125码是114.3米),那么你想要做的就是开始每个光线投射在枪管的中心并创建一个&#34;随机& #34;每25码(或22.86统一单位)模拟40英寸(1.016单位)传播的旋转。您可以通过将Random()
与Quaternion.AngleAxis()
相结合来实现这一目标,直到您获得良好(现实但仍然非常随机)的传播。
另外,我想指出一点。这些值是基于从一个膛线枪管中射出一个SLUG外壳。使用带有弹簧的膛线枪管可以用霰弹枪提供最大的制动力。所以,你可以考虑这些MAX值,使用MIN武器处理量(因为一个slu can几乎可以让你的手臂脱落)。如果在你的游戏中,你想要大量的霰弹枪和炮弹可供使用,并且你想要最大程度的真实感,那么你需要考虑当前射击的炮弹是弹射,鸟类还是slu and,以及你还需要考虑桶的类型。降落/鸟类在更远的范围内可能不那么有效,但它们的处理能力大大提高。