Unity 3D- "Is Trigger" Under Sphere Collider 不允许我的 fireball/projectile 飞行
Unity 3D- The "Is Trigger" Under Sphere Collider Is not allowing my fireball/projectile to fly
我正在阅读这本关于 Unity 的书(2018 年出版),它指示我点击“Is Trigger?” Inspector 的 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# 脚本本身上创建触发器,而不是依赖于该复选框。
任何人都可以验证这一点并帮助我了解如何应用该代码吗?
提前致谢。
请参考Colliders -> Collision Action Matrix
=> 如果 none 个对象是触发器,则 OnTriggerEnter
is never called and you might rather want to go for OnCollisionEnter
同样,一般来说,只要您处理物理(Rigidbody
、Rigidbody2D
),您就会不想要使用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;
}
让物理引擎自己处理运动。
一切顺利。我注意到我创建的敌人的 body 有 50% 实际上卡在了地板上,而且火球一直在撞击地板。这最终是我的愚蠢,没有意识到我的 object 在 3D space 中的位置。顺便说一句,谢谢你的回答。我也会应用它们。 =)
我正在阅读这本关于 Unity 的书(2018 年出版),它指示我点击“Is Trigger?” Inspector 的 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# 脚本本身上创建触发器,而不是依赖于该复选框。
任何人都可以验证这一点并帮助我了解如何应用该代码吗?
提前致谢。
请参考Colliders -> Collision Action Matrix
=> 如果 none 个对象是触发器,则 OnTriggerEnter
is never called and you might rather want to go for OnCollisionEnter
同样,一般来说,只要您处理物理(Rigidbody
、Rigidbody2D
),您就会不想要使用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;
}
让物理引擎自己处理运动。
一切顺利。我注意到我创建的敌人的 body 有 50% 实际上卡在了地板上,而且火球一直在撞击地板。这最终是我的愚蠢,没有意识到我的 object 在 3D space 中的位置。顺便说一句,谢谢你的回答。我也会应用它们。 =)