zoukankan      html  css  js  c++  java
  • 关于Unity中的小案例之运动的小船以及摄像机跟随技术(专题五)

    实例步骤

    1.创建Unity项目和文件目录,保存场景

    场景搭建

    2.导入美术做好的资源包(第68)  

      a: 导入地形资源包terrain.unitypackage,把里面的Map/Prefabs/Terrain预制体拖入场景;
      b: 导入地形上的物体资源包Props.unitypackage,把里面的Map/Prefabs/Props 1预制体拖入场景;
      c: 导入水特效资源包water.unitypackage,把里面的Standard Assets/Water (Basic)/Daylight Simple Water预制体拖入场景;
      d: 导入人物角色资源包boss.unitypackage,把里面的Map/Boss预制体拖入场景;
      e: 导入easyTouch摇杆资源包easy_touch.unitypackage,点击菜单的多出来的选项Hedgehog Team---->Easy Touch---->Add EasyTouch for C#,再点击Hedgehog Team---->Easy Touch---->Extensions---->Adding a new joystick;

       摇杆的图片可以更换的,在New Joystick节点的Joystick textures组件里面更改

      f: 每个物体障碍物都会加了一个碰撞器,这样船就不能穿过去了

    3.调整摄像机的位置,使它在船的附近,可以看到船,快捷的方法是把摄像机先拖到船的节点下变成子节点,然后设置坐标(0,0,0),再调整到刚好看见船,调整完毕再移出子节点,就可以了。

    4.船停在原地时候的波纹其实是一个粒子效果,在j节点Boss---->shake---->Rowing---->Waterdown---->Renderer---->Material---->water_sp1,以及材质的纹理贴图foam,使用的Shader是Particles/Additive

     

    添加平移逻辑

    5.创建一个脚本move控制船跟随摇杆的运动,挂载到船节点Boss下

      a: 遥感控制汽船移动与调整方向;
      b: y轴控制动力, x轴控制方向;
      c: 将摇杆分成了4个区域,y < -0.5(向后) y > 0.5(向前); x < 0.5 x > 0.5(调整方向);

     打开move.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class move : MonoBehaviour {
    
        public EasyJoystick joystick;//关联New joystick节点
        private float speed = 5.0f;//1秒移动5米
        private float w_speed = 45;//8秒转一圈,1秒转45度
        // Use this for initialization
        void Start () {
            
        }
        
        // Update is called once per frame
        void Update () {
    
            if (this.joystick.JoystickTouch.y < -0.5f) // 往后[-0.5, -1]
            {
                this.transform.Translate(0, 0, -this.speed * Time.deltaTime);
            }
            else if (this.joystick.JoystickTouch.y > 0.5f) // 往前[0.5, 1]
            {
                this.transform.Translate(0, 0, this.speed * Time.deltaTime);
            }
    
    
            if (this.joystick.JoystickTouch.x < -0.5f)
            {
                this.transform.Rotate(0, -this.w_speed * Time.deltaTime, 0);//绕自己的Y轴旋转,负为逆时针
            }
            else if (this.joystick.JoystickTouch.x > 0.5f)
            {
                this.transform.Rotate(0, this.w_speed * Time.deltaTime, 0);//绕自己的Y轴旋转,正为顺时针
            }
        }
    }

    绕自己的Y轴旋转,逆时针为负,顺时针为正

     

    汽船在水面的摇晃

    6.模拟船的摇晃属于船的动画效果,该脚本不应该挂载在船的根节点Boss下,应该挂载在Boss的子节点shake下,专门模拟船的动画效果

      a: 汽船绕z轴左右摇晃:
        欧拉角: > 4度 && < 180,就要往回逆时针方向摆,< (360 - 4) && > 180;
      b: 汽船绕x轴前后晃动
      c: 欧拉角的范围[0, 360];顺时针为正,逆时针为负;

    7.创建一个脚本shake控制船的摇晃,挂载到节点Boss/shake下

     打开shake.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class shake : MonoBehaviour {
        private float z_s_speed = 3.0f;//左右晃的角速度
        private float x_s_speed = 2.0f;//前后晃的角速度
    
        // Use this for initialization
        void Start () {
            
        }
        
        // Update is called once per frame
        void Update () {
            // this.transform.eulerAngles是当前所转的欧拉角,欧拉角范围[0, 360]
            if (this.transform.eulerAngles.z >= 4 && this.transform.eulerAngles.z < 180)//大于4度,小于180度
            {
                this.z_s_speed = -this.z_s_speed;//超过范围,速度方向更改
            }
            else if (this.transform.eulerAngles.z > 180 && this.transform.eulerAngles.z <= (360 - 4))//大于180度,小于(360-4)度
            {
                this.z_s_speed = -this.z_s_speed;//超过范围,速度方向更改
            }
    
            if (this.transform.eulerAngles.x >= 4 && this.transform.eulerAngles.x < 180)
            {
                this.x_s_speed = -this.x_s_speed;//超过范围,速度方向更改
            }
            else if (this.transform.eulerAngles.x > 180 && this.transform.eulerAngles.x <= (360 - 4))
            {
                this.x_s_speed = -this.x_s_speed;//超过范围,速度方向更改
            }
    
    
            this.transform.Rotate(this.x_s_speed * Time.deltaTime, 0, this.z_s_speed * Time.deltaTime);//绕z轴和绕x轴转
        }
    }

    绕Z的旋转范围,绕X轴的是一样的,这里没放绕X轴的

     

    摄像机跟随船移动

    8..创建一个脚本camera_follow控制摄像机跟随船移动,挂载到主摄像机Main Camera节点下

      a: 摄像机跟着汽船的位置,并距离物体后4米的位置;
      b: 摄像机对准目标物体;
      c: 将摄像机拉高1米对着汽船;
      d: Quaternion.Euler, 欧拉角转四元数

     打开camera_follow.cs

    using UnityEngine;
    using System.Collections;
    
    public class camera_follow : MonoBehaviour
    {
        public Transform target;//要跟随的目标的Transform组件,这里关联Boss/shake/Target
        // Use this for initialization
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
            if (this.target == null)//如果跟随的目标不存在,就直接返回
            {
                return;
            }
    
            // (1)摄像机移动到当前的物体所在的位置
            this.transform.position = this.target.position;
    
            // (2)往后拉4米
            Quaternion rot = Quaternion.Euler(0, this.target.eulerAngles.y, 0);//欧拉角转四元素,旧的Quaternion.EulerAngles已经废弃,旧的表示的是弧度,不是角度
            this.transform.position -= rot * Vector3.forward * 4;//target的四元素旋转矩阵*摄像机自己的正Z方向=target的方向,target的方向*4=一个三维坐标向量
                                                                                  
            // (3)将摄像机抬高一米
            Vector3 position = this.transform.position;
            position.y += 1;
            this.transform.position = position;
    
            // (4) 摄像机对准某个物体,将自己的Z轴对准目标
            this.transform.LookAt(this.target);
        }
    }

     9.运行,摄像机就会跟着船运动了,还有一种直接把摄像机当作boss的子节点,也会跟着运动,但是那种不灵活。

  • 相关阅读:
    2018.09.25python学习第十天part3
    2018.09.25python学习第十天part2
    2018.09.25python学习第十天part1
    2018.09.21python学习第九天part3
    2018.09.21python学习第九天part2
    2018.09.21python学习第九天part1
    2018.09.20python作业
    Alpha 冲刺(3/10)
    Alpha 冲刺(2/10)
    Alpha 冲刺(1/10)
  • 原文地址:https://www.cnblogs.com/HangZhe/p/7307446.html
Copyright © 2011-2022 走看看