gpt4 book ai didi

c# - 沿光线转换移动对象

转载 作者:行者123 更新时间:2023-12-03 22:56:25 25 4
gpt4 key购买 nike

我制作了一个从我的相机到点击对象点的 Raycast。然而,我试图让一个物体(在本例中是一颗子弹)沿着光线的路径飞行。由于向量 3,无论您在对象上的哪个位置单击,它都会从相机直接向前飞行。我如何让它跟随射线?

C#

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

public class RaycastShot : MonoBehaviour {

public Camera camera;
private Ray ray;
private RaycastHit hit;
public GameObject bullet;
private GameObject createBullet;
private Collider collider;

void Update () {
if (Input.GetMouseButtonDown (0)) {
ray = camera.ScreenPointToRay (Input.mousePosition);

createBullet = Instantiate (bullet, camera.transform.position, bullet.transform.rotation);
createBullet.AddComponent<Rigidbody>();
createBullet.GetComponent<Rigidbody>().AddRelativeForce (new Vector3(0, 1500, 0));
createBullet.GetComponent<Rigidbody>().useGravity = false;
collider = createBullet.GetComponent<Collider> ();
Destroy (collider);

if (Physics.Raycast (ray, out hit)) {

}
}
Debug.DrawLine (ray.origin, hit.point, Color.red);
}
}

最佳答案

您可能希望使用 ray.direction 属性而不是 (0,1500,0) 作为力的方向。

添加力应该发生在 FixedUpdate 中,并且应该只在射线击中某物时发生。你现在拥有它的地方可能不是最好的地方。

当然,首先要确保子弹在相机的位置被实例化。

Ray.direction 为您提供射线对象的 vector3 方向。如果你需要它击中的距离,你也可以使用 ray.distance。

编辑:我现在在我的电脑旁边,所以这里有一个与您的评论相关的更详细的答案。

首先:这是我设置测试项目的方式: enter image description here

我创建了一个预制子弹。这只是一个带有刚体的球体,附有我的“BulletController”脚本。预制件的要点是避免所有那些必须添加组件的行。出于测试目的,我将刚体设置为忽略重力并将其质量设置为 0.1。

接下来,我创建了 BulletController 脚本,它将附加到子弹预制件。

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

public class BulletController : MonoBehaviour {

Rigidbody rb;
public float bulletForce;
bool firstTime = false;
Vector3 direction;

// Use this for initialization
void Start () {
rb = GetComponent<Rigidbody> ();
}


public void SetDirection (Vector3 dir) {
direction = dir;
firstTime = true;
}

void OnCollisionEnter () {
//code for when bullet hits something
}

void FixedUpdate () {
if (firstTime) {
rb.AddForce (direction * bulletForce);
firstTime = false;
}
}
}

这个脚本是负责控制子弹的。将创建项目符号的(稍后)脚本并不关心它们之后会发生什么,因为它的工作只是创建项目符号。这个 BulletController 脚本负责处理创建的子弹。

主要部分是 SetDirection 方法,它告诉子弹向哪个方向行进。它还在其 FixedUpdate 方法中添加了一个一次性力,将它推向您刚刚设置的方向。 FixedUpdate 用于添加力等物理变化。不要使用更新来做这种事情。它将力乘以您设置的称为“bulletForce”的力。

最后是 BulletListener 脚本,它只是附加到场景中的一个空游戏对象。该脚本负责监听鼠标点击并为它们创建子弹。

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

public class BulletListener : MonoBehaviour {

public Camera mainCamera;
public BulletController bulletPrefab;

void Update () {
if (Input.GetMouseButtonDown (0)) {

//create ray from camera to mousePosition
Ray ray = mainCamera.ScreenPointToRay (Input.mousePosition);

//Create bullet from the prefab
BulletController newBullet = Instantiate (bulletPrefab.gameObject).GetComponent<BulletController> ();

//Make the new bullet start at camera
newBullet.transform.position = mainCamera.transform.position;

//set bullet direction
newBullet.SetDirection (ray.direction);

}

}
}

在这个空游戏对象的检查器中,我添加了这个脚本,然后将相机和 bulletPrefab 拖到适当的字段中。一定要从文件夹中拖动预制件,而不是从场景中。因为这将使用预制件,而不是场景中的对象。

现在四处点击,你会看到子弹在飞!请注意,使用较小的力可以很好地进行测试,稍后再增加。

要摆脱的主要事情是拆分您的逻辑。一个脚本应该只负责一件事。例如,您的敌人也可能会发射子弹。您现在也可以为这些项目符号重用 bulletController 脚本。此外,假设您有不同大小或形状的子弹,您只需将 bulletcontroller 脚本拖到您为子弹制作的不同预制件上。这不会影响您的监听器脚本,它仍会在您单击的位置创建项目符号。

关于c# - 沿光线转换移动对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47375296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com