unity3d Z战斗的方法来修复弹孔?

gywdnpxw  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(164)

我试着通过基本的FPS射击来练习,我想在你射击的地方有弹孔。然而,当我试图这样做的时候,纹理Z战斗发生了。
枪使用光线投射的工作方式如下:
Physics.Raycast(playercam.transform.position, playercam.transform.forward, out hit)
弹孔目前是一个2D精灵,我使用以下脚本将其放置在目标上:
GameObject ceffect = Instantiate(bullethole, hit.point, Quaternion.LookRotation(hit.normal));
理论上这应该工作,它确实,然而,当它被放置在世界上,它Z-战斗与地板纹理。
我尝试过在不同的层上渲染弹孔,但这根本不起作用。
有没有办法把sprite拉到对象的顶部?我是不是在图层上遗漏了什么?如果你需要更多的代码,这是我目前的拍摄脚本,但是看看你自己的风险。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerShooting : MonoBehaviour
{
    public float fireRate = 2f;
    public float weapon = 1f;
    public float pistoldmg = 5f;
    public Camera playercam;
    public GameObject redblood;
    public GameObject bullethole;
    private float timetofire = 0f;
    void Start()
    {

    }

    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Mouse0) && (Time.time > timetofire))
        {
            timetofire = Time.time + 1f / fireRate;
            PistolShoot();
        }
        else if(Input.GetKey(KeyCode.Mouse0))
        {

        }
    }

    void PistolShoot()
    {
        RaycastHit hit;
        if(Physics.Raycast(playercam.transform.position, playercam.transform.forward, out hit))
        {
            Enemy1 enemy = hit.transform.GetComponent<Enemy1>();
            if(enemy != null)
            {
                enemy.Shot(pistoldmg);
                GameObject beffect = Instantiate(redblood, hit.point, Quaternion.LookRotation(hit.normal));
                GameObject ceffect = Instantiate(bullethole, hit.point, Quaternion.LookRotation(hit.normal));
            }
            else 
            {
                GameObject beffect = Instantiate(redblood, hit.point, Quaternion.LookRotation(hit.normal));
                GameObject ceffect = Instantiate(bullethole, hit.point, Quaternion.LookRotation(hit.normal));
            }
        }
    } 
}

`

eh57zj3b

eh57zj3b1#

从光线投射命中信息中,我们可以得到法向矢量,你可以用它来旋转对象。我们也可以用同样的法向矢量来“轻推”对象远离命中点。一段代码的例子看起来像这样:

void PistolShoot ( )
{
    if ( Physics.Raycast ( playercam.transform.position, playercam.transform.forward, out var hit ) )
    {
        if ( hit.transform.TryGetComponent<Enemy1> ( out var enemy ) )
            enemy.Shot ( pistoldmg );

        var rotation = Quaternion.LookRotation(hit.normal);
        var beffect = Instantiate(redblood, hit.point + hit.normal * 0.01f, rotation );
        var ceffect = Instantiate(bullethole, hit.point + hit.normal * 0.02f, rotation );

        // .. are you using 'beffect' and 'ceffect' after this? There may not be a need to store these.
    }
}

这会将redblood对象推离命中点大约“1厘米”,将bullethole对象推离命中点大约“2厘米”。这可能需要调整以适合您的测量,但如果您遵循了一对一的Unity单位到米的指南,那么这可能会起到作用。
请注意,某些移动的电话在计算位置时使用较低的精度,因此您可能需要增加此值以使其更明显。
下面是一个在1x 1x 1立方体上使用稍微夸张的微移量的示例- 0.05和0.1而不是0.01和0.02。x1c 0d1x

相关问题