unity曲线射击




b站教程

csharp 复制代码
using UnityEngine;
using System.Collections;

public class BallLauncher : MonoBehaviour {
    public float m_R;
	public NewBullet m_BulletPre;
	public Transform m_Target;
    private void Start()
    {
        StartCoroutine(Attack());
    }
    private void OnDestroy()
    {
        StopAllCoroutines();
    }
    private IEnumerator Attack()
    {
        while(true)
        {
            NewBullet bullet = Instantiate(m_BulletPre, transform.position, Quaternion.identity);
            bullet.Attack(transform.position, GetRandomPoint(m_R), m_Target);
            yield return new WaitForSeconds(0.1f);
            yield return null;
        }
    }
    private Vector3 GetRandomPoint(float r)
    {
        float x = Random.Range(-r, r);
        float ydis = m_Target.position.y - transform.position.y;
        float y = Random.Range(1, ydis);
        float z = Random.Range(-r, r);
        Vector3 vector3 = new Vector3(x, y, 0);
        return transform.position + vector3;
    }
}
	

第一种教程里面的

csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet : MonoBehaviour
{
    public float speed = 5f;
    private void Start()
    {
        Destroy(gameObject,15f);
    }
    private void OnDestroy()
    {
        StopAllCoroutines();
    }
    public void Attack(Vector3 start, Vector3 midPoint, Transform target)
    {
        StartCoroutine(Move(start, midPoint, target));
    }
    private IEnumerator Move(Vector3 start, Vector3 midPoint, Transform target)
    {
        for (float i = 0; i <= 1f; i += Time.deltaTime)
        {
            Vector3 p1 = Vector3.Lerp(start, midPoint, i);
            Vector3 p2 = Vector3.Lerp(midPoint, target.position, i);
            Vector3 p = Vector3.Lerp(p1, p2, i);
            //让子弹移动到p点
            yield return StartCoroutine(MoveToPoint(p));
        }

        yield return StartCoroutine(MoveToObject(target));
    }
    private IEnumerator MoveToPoint(Vector3 p)
    {
        yield return null;
        while (Vector3.Distance(transform.position, p) > 0.1f){
            Vector3 dir = p - transform.position;
            transform.up = dir;
            transform.position = Vector3.MoveTowards(transform.position, p, Time.deltaTime * speed);
            yield return null;
        }
    }
   private IEnumerator MoveToObject(Transform target)
    {
        yield return null;
        while (Vector3.Distance(transform.position, target.position) > 0.1f){
            Vector3 dir = target.position - transform.position;
            transform.up = dir;
            transform.position = Vector3.MoveTowards(transform.position, target.position, Time.deltaTime * speed);
            yield return null;
        }
    }
    private void OnTriggerEnter(Collider other)
    {
        if(other.gameObject.name=="Target")
        {
            Destroy(gameObject);
        }
    }
}

第二种:教程发给DeepSeek后的

csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBullet : MonoBehaviour
{
    public float speed = 5f;
    [SerializeField] private string targetTag = "Target"; // 使用标签检测目标

    private Transform target;
    private Coroutine moveCoroutine;

    private void Start() => Destroy(gameObject, 15f);

    public void Attack(Vector3 start, Vector3 midPoint, Transform target)
    {
        this.target = target;
        moveCoroutine = StartCoroutine(MoveCoroutine(start, midPoint, target));
    }

    private IEnumerator MoveCoroutine(Vector3 start, Vector3 midPoint, Transform target)
    {
        // 贝塞尔曲线阶段
        Vector3 endPosition = target.position;
        float duration = CalculateBezierDuration(start, midPoint, endPosition);
        float t = 0f;

        while (t < 1f)
        {
            if (target == null)
            {
                Destroy(gameObject);
                yield break;
            }

            endPosition = target.position; // 动态更新终点位置
            UpdatePositionAndRotation(t, start, midPoint, endPosition);

            t += Time.deltaTime / duration;
            yield return null;
        }

        // 精确追踪阶段
        while (target != null)
        {
            UpdatePositionAndRotation(target.position);
            if (Vector3.Distance(transform.position, target.position) <= 0.1f) break;
            yield return null;
        }

        Destroy(gameObject);
    }

    private float CalculateBezierDuration(Vector3 start, Vector3 mid, Vector3 end)
    {
        // 采样估算曲线长度
        float sampledLength = 0f;
        Vector3 prev = start;
        for (int i = 1; i <= 5; i++)
        {
            Vector3 point = CalculateBezierPoint(i / 5f, start, mid, end);
            sampledLength += Vector3.Distance(prev, point);
            prev = point;
        }
        return sampledLength / speed;
    }

    private Vector3 CalculateBezierPoint(float t, Vector3 start, Vector3 mid, Vector3 end) =>
        (1 - t) * (1 - t) * start + 2 * (1 - t) * t * mid + t * t * end;

    private void UpdatePositionAndRotation(float t, Vector3 start, Vector3 mid, Vector3 end)
    {
        Vector3 targetPos = CalculateBezierPoint(t, start, mid, end);
        Vector3 direction = targetPos - transform.position;
        transform.position = Vector3.MoveTowards(transform.position, targetPos, speed * Time.deltaTime);
        if (direction != Vector3.zero)
            transform.up = direction;
    }

    private void UpdatePositionAndRotation(Vector3 targetPos)
    {
        Vector3 direction = targetPos - transform.position;
        transform.position = Vector3.MoveTowards(transform.position, targetPos, speed * Time.deltaTime);
        if (direction != Vector3.zero)
            transform.up = direction;
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag(targetTag))
            Destroy(gameObject);
    }

    private void OnDestroy()
    {
        if (moveCoroutine != null)
            StopCoroutine(moveCoroutine);
    }
}
相关推荐
徐子竣4 小时前
[学习记录]Unity-Shader-几何着色器
unity·游戏引擎·着色器
EQ-雪梨蛋花汤10 小时前
【Part 3 Unity VR眼镜端播放器开发与优化】第四节|高分辨率VR全景视频播放性能优化
unity·音视频·vr
与火星的孩子对话14 小时前
Unity进阶课程【六】Android、ios、Pad 终端设备打包局域网IP调试、USB调试、性能检测、控制台打印日志等、C#
android·unity·ios·c#·ip
幻世界16 小时前
【Unity智能模型系列】Unity + MediaPipe + Sentis + ArcFace模型:构建高效人脸识别比对系统
unity·游戏引擎
漫游者Nova1 天前
虚幻引擎Unreal Engine5恐怖游戏设计制作教程,从入门到精通从零开始完整项目开发实战详细讲解中英字幕
ue5·游戏引擎·虚幻·游戏开发完整教程·恐怖游戏开发
死也不注释1 天前
【Unity 编辑器工具开发:GUILayout 与 EditorGUILayout 对比分析】
unity·编辑器·游戏引擎
小赖同学啊2 天前
物联网中的Unity/Unreal引擎集成:数字孪生与可视化控制
物联网·unity·游戏引擎
Zlzxzw2 天前
使用unity创建项目,进行动画制作
unity·游戏引擎
X_StarX2 天前
【Unity笔记01】基于单例模式的简单UI框架
笔记·ui·unity·单例模式·游戏引擎·游戏开发·大学生
九班长2 天前
Golang服务端处理Unity 3D游戏地图与碰撞的详细实现
3d·unity·golang