Unity基础(六)小案例

1.通过向量和四元数控制子弹发射

子弹类

复制代码
public class bullet : MonoBehaviour
{
    public float speed;
    void Start()
    {
        Destroy(gameObject,3);
    }
    void Update()
    {
    this.transform.Translate(Vector3.forward * Time.deltaTime * speed);
    }
}

Vector3.forward使用的是常量,不出错。

发射控制

复制代码
enum E_BulletType
{
    One,
    Two,
    Three,
    Round
}
public class shoot : MonoBehaviour
{
    public GameObject bullet;
    private E_BulletType btype = E_BulletType.One;
    public int num = 4;
    // Start is called before the first frame update
    void Start()
    {
       
    }
    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
            {
            btype=E_BulletType.One;
            }
        else if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            btype = E_BulletType.Two;
        }
        else if (Input.GetKeyDown(KeyCode.Alpha3))
        {
            btype = E_BulletType.Three;
        }
        else if (Input.GetKeyDown(KeyCode.Alpha4))
        {
            btype = E_BulletType.Round;
        }


        if (Input.GetKeyDown("a"))
        {
            switch (btype)
            {
                case E_BulletType.One:

                    GameObject.Instantiate(bullet, this.transform.position, this.transform.rotation);

                    break;
                case E_BulletType.Two:

                    GameObject.Instantiate(bullet, this.transform.position + this.transform.right*0.5f, this.transform.rotation);
                    GameObject.Instantiate(bullet, this.transform.position - this.transform.right * 0.5f, this.transform.rotation);
                    break;
                case E_BulletType.Three:
                    GameObject.Instantiate(bullet, this.transform.position, this.transform.rotation*(Quaternion.AngleAxis(20,Vector3.up)));
                    GameObject.Instantiate(bullet, this.transform.position, this.transform.rotation * (Quaternion.AngleAxis(-20, Vector3.up)));
                    GameObject.Instantiate(bullet, this.transform.position, this.transform.rotation);
                    break;
                case E_BulletType.Round:
                    float angle = 360 / num;
                    for (int i = 0; i <num; i++)
                    {

         GameObject.Instantiate(bullet, this.transform.position, this.transform.rotation*Quaternion.AngleAxis(i*angle,Vector3.up));
                    }                    
                    break;
            }
        }        
    }
}

要用Quaternion.AngleAxis(20,Vector3.up) ,也有Quaternion.AxisAngle 老方法(不使用)。

2.摄像机跟随效果

cs 复制代码
 //目标对象
 public Transform target;
 //相对头顶的偏移位置
 public float headOffsetH = 1;
 //倾斜角度
 public float angle = 45;
 //默认的 摄像机离观测点的距离
 public float dis = 5;

 //距离必须是3和10之间
 public float minDis = 3;
 public float maxDis = 10;
 //鼠标中间滚动控制的移动速度
 public float roundSpeed = 1;
 //看向对象时 四元数 旋转的速度
 public float lookAtSpeed = 2;
 //跟随对象移动的 速度
 public float moveSpeed = 2;
 //当前摄像机应该在的位置
 Vector3 nowPos;

 private Vector3 nowDir;

 //实现了鼠标中键 滚动 来改变摄像机远近
 dis += Input.GetAxis("Mouse ScrollWheel")*roundSpeed;
 dis = Mathf.Clamp(dis, minDis, maxDis);

 //向头顶偏移位置
 nowPos = target.position + target.up * headOffsetH;
 //往后方偏移位置
 nowDir = Quaternion.AngleAxis(angle, target.right) * -target.forward;
 nowPos = nowPos + nowDir * dis;

 //直接把算出来的位置 进行赋值
 //this.transform.position = nowPos;
 this.transform.position = Vector3.Lerp(this.transform.position, nowPos, Time.deltaTime* moveSpeed);

 Debug.DrawLine(this.transform.position, target.position + target.up * headOffsetH);
 //这里是 通过插值运算 来缓动 看向 物体
 this.transform.rotation = Quaternion.Slerp(this.transform.rotation, Quaternion.LookRotation(-nowDir), Time.deltaTime* lookAtSpeed);
相关推荐
寂寞的船16 小时前
【Unity知识速递】第13期 Unity 内存泄漏排查实战:从 Memory Profiler 到 Lua 引用泄漏的生产级全链路诊断
unity·junit·c#·游戏引擎·lua
寂寞的船1 天前
【Unity Bug挑战】第12期 Awaitable 二次 await 死锁之谜 —— 为什么同一个异步操作等两次就卡死?
unity·c#·游戏引擎·bug
Hello_Pyhx2 天前
Pavise v3.3.0.8 配置指南:从游戏识别到会话恢复
游戏
探求虚无3 天前
用 AI 在 Unity 里做一款 RTS:最难的不是生成代码,而是证明它真的能玩
人工智能·unity·游戏引擎
johnsong4 天前
Claude Fable 5.2 登顶:65 分、单发做游戏,和一份 $26.54 一单的账单
人工智能·游戏
17岁的勇气4 天前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity
寂寞的船5 天前
【Unity知识速递】第10期 Unity GC 零分配实战:从 UnityEngine.Pool 到手动 GC 控制的全链路优化
jvm·unity·c#·游戏引擎·lucene
shadowcz0075 天前
屿北:站在新旧时代交接处,赌一场AI原生无限游戏#Infinite Talk
游戏·ai-native
Martina_03215 天前
AI生成3D场景的霓虹灯一开就糊成光团?用6步检查Emissive、Bloom与曝光
人工智能·3d·ai·自然语言处理·游戏引擎·材质·贴图
寂寞的船7 天前
【Unity知识速递】第8期 IL2CPP 托管堆内存碎片与原生堆交互机制深度解析
unity·游戏引擎·交互