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变量(涨姿势)
------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Tanks案例笔记(二、坦克创建与控制)
- Tanks案例笔记(三、相机控制)
- Tanks案例笔记(一、场景搭建)
- 坦克游戏教程二:实现坦克移动以及方向控制
- 版本控制二(创建仓库与使用)
- Awesome Tanks在线flash游戏-现代版的坦克大战
- 《武装坦克 Dawn Tanks》评测:对射打炮专治技术派!
- 《java基础与案例开发详解》笔记(二)
- 实例案例二:创建数据库
- C语言写坦克大战笔记(二)
- U3D学习笔记二:3D坦克大战
- unity官方教程Tanks《坦克大战》中摄像机size的调整的疑问
- 坦克大战(二)
- 线程创建与控制
- 读《坦克战》笔记
- 坦克大战学习笔记
- iOS多线程学习笔记之二:线程创建与启动
- ionic 学习笔记 二 :创建工程与初步分析
- 西部数据移动硬盘识别不了
- Qt之LiteIDE中漂亮的几款QSS
- E/MediaRecorder: start failed: -38
- VNC连接Linux桌面
- Pb的事务处理机制
- Tanks案例笔记(二、坦克创建与控制)
- Java中.next()和.nextLine()的区别
- fragment中onActivityResult不调用
- 北京汉传佛寺游人评价数据的抓取与分析(2)
- Zuul性能测试
- ElasticSearch 索引相关操作
- 全国直播,我用35分钟讲完了60分钟的课
- Android开发中防止再入坑
- HDU1532最大流入门