Unity 3D - Sphere Collider 下的“Is Trigger”不允许我的火球/弹丸飞行

Posted

技术标签:

【中文标题】Unity 3D - Sphere Collider 下的“Is Trigger”不允许我的火球/弹丸飞行【英文标题】:Unity 3D- The "Is Trigger" Under Sphere Collider Is not allowing my fireball/projectile to fly 【发布时间】:2021-10-29 23:40:52 【问题描述】:

我正在阅读这本关于 Unity 的书(2018 年出版),它指示我点击“是触发器吗?”检查器的 Sphere Collider 部分下的框。

当我不点击它时,弹丸飞得很好。但是当我点击它时,它只是卡在了游戏对象的起点。

这是弹丸代码:

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

public class Fireball : MonoBehaviour

    public float speed = 10.0f;
    public int damage = 1;
    // Start is called before the first frame update
    
    // Update is called once per frame
    void Update()
    
        transform.Translate(0, 0, speed * Time.deltaTime);
    

    void OnTriggerEnter(Collider other)
    
        PlayerCharacter player = other.GetComponent<PlayerCharacter>();
        if (player != null)
        
            player.Hurt(damage);
        
        Destroy(this.gameObject);
    



这是附在敌人身上的伴随代码:


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

public class WanderingAI : MonoBehaviour

    public float speed = 3.0f;
    public float obstacleRange = 5.0f;
    private bool _alive;

    [SerializeField] private GameObject fireballPrefab;
    private GameObject _fireball;

    void Start()
    
        _alive = true;    
    

    // Update is called once per frame
    void Update()
    
        if (_alive)
        
            transform.Translate(0, 0, speed * Time.deltaTime);

            Ray ray = new Ray(transform.position, transform.forward);
            RaycastHit hit;
            if (Physics.SphereCast(ray, 0.75f, out hit))
            
                GameObject hitObject = hit.transform.gameObject;
                if (hitObject.GetComponent<PlayerCharacter>())
                
                    if (_fireball == null)
                    
                        _fireball = Instantiate(fireballPrefab) as GameObject;
                        _fireball.transform.position = transform.TransformPoint(Vector3.forward * 1.5f);
                        _fireball.transform.rotation = transform.rotation;
                    
                

                else if (hit.distance < obstacleRange)
                
                    float angle = Random.Range(-110, 110);
                    transform.Rotate(0, angle, 0);
                
            
        
    

    public void SetAlive(bool alive)
    
        _alive = alive;
    


我需要点击“是触发器?”盒子,否则我的弹丸只会躺在地板上,撞到墙上后什么都不做。

我认为问题不在于代码本身,而在于 2018 年之后我不熟悉的 Unity 更新(因为我基本上是在两周前开始使用 Unity)。

我猜我应该在 C# 脚本本身上创建触发器,而不是依赖于该复选框。

谁能验证这一点并帮助我了解如何应用该代码?

提前致谢。

【问题讨论】:

【参考方案1】:

请参考Colliders -> Collision Action Matrix

=> 如果您的所有对象都不是触发器,则永远不会调用 OnTriggerEnter,您可能更愿意使用 OnCollisionEnter


一般来说,当您处理物理(RigidbodyRigidbody2D)时,您确实想使用 Transform 组件转换您的对象!

而不是

void Update()

    transform.Translate(0, 0, speed * Time.deltaTime);

你应该这样做

[SerializeField] private Rigidbody _rigidbody;

private void Awake()

    if(!_rigidbody) _rigidbody = GetComponent<Rigidbody>();

    _rigidbody.velocity = _rigidbody.rotation * Vector3.forward * speed;

让物理引擎自己处理运动。

【讨论】:

【参考方案2】:

一切都好。我注意到我创造的敌人的 50% 的身体实际上是卡在地板上,而火球一直在击中地板。这对我来说是愚蠢的,并且不知道我的对象在 3D 空间中的位置。谢谢你的回答顺便说一句。我也会应用它们。 =)

【讨论】:

以上是关于Unity 3D - Sphere Collider 下的“Is Trigger”不允许我的火球/弹丸飞行的主要内容,如果未能解决你的问题,请参考以下文章

如何用Unity 画一个3D的线,线就像一个管道

Unity3.1 利用内置的3D对象创建三维模型

如何在unity3d中加载大工程模型

unity3d通过代码动态创建销毁游戏对象

Unity3D中GameObject 详细介绍

U3D面试题六