Tanks案例笔记(二、坦克创建与控制)

来源:互联网 发布:Centos安装jdk 编辑:程序博客网 时间:2024/05/22 03:22

二、坦克创建与控制

1.把资源里的Tank资源拖到project面板


2.要把坦克和场景中其他物体区别开,所以把坦克放到Player layer层上,不用于子物体“No,this object only”。


3.加一些脚本:

1/ Rigidbody刚体:用于物理运动:在Constraints上勾上Position的Y和Rotation的x,z

2/ BoxCollider碰撞器,用于与其他物体交互:中心(0,0.85,0),大小(1.5,1.7,1.6)

3/ AudioSource播放音效:加两个

第一个:拖入EngineIdle音效用于坦克待机时候的声音,勾选PlayOnAwake和Loop

第二个:用于坦克反射子弹时候播音效,不勾选playonawake和loop,不拖音效;


4.把场景中Tank拖拽到Project面板的Prefabs文件夹形成预制。


5.把Prefabs文件夹中的DustTrail预制拖到场景中Tank下作为子物体,并Ctrl+D复制一个,

改名LeftDustTrail(位置(-0.5,0,-0.75))和RightDustTrail(位置(0.5,0,-0.75))


6.给坦克加上TankMovement脚本:

作用:获取用户输入、设置音效、设置前后移动、设置旋转

using UnityEngine;public class TankMovement : MonoBehaviour{    public int m_PlayerNumber = 1;          //玩家数量(这里相当于玩家索引,用于区分输入 )    public float m_Speed = 12f;             //移动速度    public float m_TurnSpeed = 180f;        //旋转速度    public AudioSource m_MovementAudio;     //声音组件    public AudioClip m_EngineIdling;        //待机音效    public AudioClip m_EngineDriving;       //行驶音效    public float m_PitchRange = 0.2f;       //音量增减范围    private string m_MovementAxisName;      //移动轴名称    private string m_TurnAxisName;          //旋转轴名称    private Rigidbody m_Rigidbody;          //刚体    private float m_MovementInputValue;     //移动输入值    private float m_TurnInputValue;         //旋转输入值    private float m_OriginalPitch;          //初始音量    private void Awake()    {        m_Rigidbody = GetComponent<Rigidbody>(); //获取组件    }    private void OnEnable ()    {        m_Rigidbody.isKinematic = false; //恢复物理属性,可以受力作用        m_MovementInputValue = 0f;       //初始化输入值        m_TurnInputValue = 0f;           //初始化输入值    }    private void OnDisable ()    {        m_Rigidbody.isKinematic = true; //取消物理属性,死亡后不再受力作用    }    private void Start()    {        //根据角色索引,设置控制对应角色的轴名        m_MovementAxisName = "Vertical" + m_PlayerNumber;        m_TurnAxisName = "Horizontal" + m_PlayerNumber;        m_OriginalPitch = m_MovementAudio.pitch;//初始化初始音量    }    private void Update()    {        //保存玩家的输入        m_MovementInputValue = Input.GetAxis(m_MovementAxisName);        m_TurnInputValue = Input.GetAxis(m_TurnAxisName);        //调整音效        EngineAudio();    }    private void EngineAudio()    {        // 根据坦克状态播放相应音效(这个播放器设置了初始音效为待机,设置了循环播放:)        if (Mathf.Abs(m_MovementInputValue) < 0.1f && Mathf.Abs(m_TurnInputValue)<0.1f) //水平垂直绝对值都<0.1,都没有输入(则待机)        {            if (m_MovementAudio.clip==m_EngineDriving) //若之前在播行驶音效,(表示刚转为待机)则转为待机音效播放            {                m_MovementAudio.clip = m_EngineIdling;                //音量随机                m_MovementAudio.pitch = Random.Range(m_OriginalPitch-m_PitchRange,m_OriginalPitch+m_PitchRange);                //更换完音效需要再次调用播放                m_MovementAudio.Play();             }        }        else //在移动或者旋转        {            if (m_MovementAudio.clip == m_EngineIdling) //若之前在播待机音效,(表示刚转为行驶)则转为行驶音效播放            {                m_MovementAudio.clip = m_EngineDriving;                //音量随机                m_MovementAudio.pitch = Random.Range(m_OriginalPitch - m_PitchRange, m_OriginalPitch + m_PitchRange);                //更换完音效需要再次调用播放                m_MovementAudio.Play();            }        }    }    private void FixedUpdate()    {        //在物理更新中移动旋转坦克        Move();        Turn();    }    private void Move()    {        // 根据玩家输入调整坦克位置        Vector3 movement = transform.forward * m_MovementInputValue * m_Speed * Time.deltaTime;        m_Rigidbody.MovePosition(m_Rigidbody.position+movement);    }    private void Turn()    {        // 根据玩家输入调整玩家旋转        float turn = m_TurnInputValue * m_TurnSpeed * Time.deltaTime;        Quaternion turnRotation = Quaternion.Euler(0f,turn,0f);        m_Rigidbody.MoveRotation(m_Rigidbody.rotation*turnRotation);    }}

然后拖入相应的资源,就可以控制坦克啦!

------------------------------------------------------------------------------------------------------------------------------------------------------------------

重点1:多角色控制

在Edit-Project Setting-Input中我们可以看到,Unity可以多输入,如下图,可以有多个水平输入、垂直输入、攻击输入等。

因此我们就可以用轴1来控制第一个角色,轴2来控制第2个角色



重点2:动态更换音效

使用m_Audio.clip=m_idleSond;这样的更改声音播放器音效后,必须要加m_Audio.Play()播放。


重点3:脚本组件可直接拖拽到面板public变量(涨姿势)


------------------------------------------------------------------------------------------------------------------------------------------------------------------

0 0
原创粉丝点击