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);
相关推荐
玖玥拾8 小时前
Unity3D RPG 入门项目(四)背包拖拽、物品悬浮提示、项目开发思维
3d·unity·游戏引擎
xcLeigh12 小时前
Unity基础:Start与Update方法——Unity脚本生命周期初探
java·unity·游戏引擎·教程
郝学胜-神的一滴14 小时前
[简化版 GAMES 104] 现代游戏引擎 05:游戏引擎世界构建核心机制深度解析
c++·程序人生·unity·游戏引擎·计算机图形学·opengl
雪碧透心凉_14 小时前
Python游戏自动化实战案例
python·游戏·自动化
笨鸟先飞的橘猫15 小时前
c++游戏后端开源框架学习——wukong(五、登录)
c++·游戏·开源
松树戈1 天前
godot项目【宝石捕手】04~添加音效、记分
游戏引擎·godot
LONGZETECH2 天前
无人机实训高成本痛点解法:虚拟仿真实现 70% 耗材损耗下降
大数据·算法·unity·架构·无人机
五仁烧饼2 天前
Unity Addressables 静默资源策略
游戏·unity·addressables
ue星空2 天前
【Godot】更换编辑器外观主题
编辑器·游戏引擎·godot
MyBili2 天前
游戏报错缺少dll、无法启动?GRLPackage 运行库合集一键修复指南
游戏·.net·directx·运行库·xna·openal·vc++ redis