UnityEngine; using System.Collections; public class PlayerControl : MonoBehaviour { [HideInInspector] public bool facingRight = true; // 为了确定玩家正在面临哪种途径 [HideInInspector] public bool jump = false; // 判断玩家是否该跳 public float moveForce = 365f; // Amount of force added to move the player left and right. public float maxSpeed = 5f; // 玩家能到达的最大速度 public AudioClip[] jumpClips; // 玩家跳的时候的声音 public float jumpForce = 1000f; // Amount of force added when the player jumps. public AudioClip[] taunts; // 但玩家嘲讽时的声音 public float tauntProbability = 50f; // Chance of a taunt happening. public float tauntDelay = 1f; // Delay for when the taunt should happen. private int tauntIndex; // The index of the taunts array indicating the most recent taunt. private Transform groundCheck; // 一个去判断玩家是否接触地面的标志 private bool grounded = false; // Whether or not the player is grounded. private Animator anim; // 指向玩家的动画组件 void Awake() { // Setting up references. // 在子对象里面找到groundCheck groundCheck = transform.Find("groundCheck"); // 获取当前的动画控制器 anim = GetComponent<Animator>(); } void Update() { // 是为能随时检测到groundCheck这个物体,添加一个名叫Ground的Layer(层次),然后把场景中的所有代表地面的物体的Layer设为Ground // 这里用到了2D射线检测Physics2D.Linecast() // LayerMask实际上是一个位码操作,在Unity3d中Layers一共有32层,这个是不能增加或者减少的: // 1 << LayerMask.NameToLayer("Ground") 这一句实际上表示射线查询只在Ground所在这个层级查找 是返回的该名字所定义的层的层索引,注意是从0开始 // 每个GameObject的Inspector面板最上方都也有个Layer选项,就在Tag旁边,unity3d已经有了几个层,我们新建个层,也叫UI,点击Add Layer,可以看到从Layer0到Layer7都灰掉了,那是不能用的,从第八个起可以用,所以在第八个建个UI的层。 // 一般情况下我们只用前两个参数,distance表示射线距离,默认是无限远,重点是最后一个参数layerMask,专门处理layer过滤的,是个整型,怎么用呢,是靠layer的二进制位来操作的 // LayerMask的NameToLayer是通过层的名称返回该层的索引,这里是8,然后1<<8换算成LayerMask值,再用LayerMask的value就可以了。 // 注意也必须设置collider才能接收碰撞,这里才能判断到。 grounded = Physics2D.Linecast(transform.position, groundCheck.position, 1 << LayerMask.NameToLayer("Ground")); //以上程式碼是用來測試是否在地面上 // If the jump button is pressed and the player is grounded then the player should jump. // 如果点击了跳的按键,并且已经着陆,那么就可以跳起来 if(Input.GetButtonDown("Jump") && grounded) jump = true; } // 因为主角游戏对象要使用到刚体力,所以一定要写在FixedUpdate里面,不能放在Update上 void FixedUpdate () { // Cache the horizontal input. // 换取水平方向的移动距离 float h = Input.GetAxis("Horizontal"); // The Speed animator parameter is set to the absolute value of the horizontal input. // 设置动画的速度变量 anim.SetFloat("Speed", Mathf.Abs(h)); // 给物体添加一个水平的力,让它移动的时候会产生惯性的效果 // If the player is changing direction (h has a different sign to velocity.x) or hasn't reached maxSpeed yet... // 如果速度小于最大的速度 if(h * rigidbody2D.velocity.x < maxSpeed) // ... add a force to the player. rigidbody2D.AddForce(Vector2.right * h * moveForce); // If the player's horizontal velocity is greater than the maxSpeed... if(Mathf.Abs(rigidbody2D.velocity.x) > maxSpeed) // ... set the player's velocity to the maxSpeed in the x axis. rigidbody2D.velocity = new Vector2(Mathf.Sign(rigidbody2D.velocity.x) * maxSpeed, rigidbody2D.velocity.y); // 转身 // If the input is moving the player right and the player is facing left... if(h > 0 && !facingRight) // ... flip the player. Flip(); // Otherwise if the input is moving the player left and the player is facing right... else if(h < 0 && facingRight) // ... flip the player. Flip(); // If the player should jump... if(jump) { // Set the Jump animator trigger parameter. // 触发跳的动画 anim.SetTrigger("Jump"); // Play a random jump audio clip. int i = Random.Range(0, jumpClips.Length); AudioSource.PlayClipAtPoint(jumpClips[i], transform.position); // Add a vertical force to the player. // 添加一个垂直的力 rigidbody2D.AddForce(new Vector2(0f, jumpForce)); // Make sure the player can't jump again until the jump conditions from Update are satisfied. jump = false; } } // 转身 void Flip () { // Switch the way the player is labelled as facing. facingRight = !facingRight; // Multiply the player's x local scale by -1. Vector3 theScale = transform.localScale; theScale.x *= -1; transform.localScale = theScale; } public IEnumerator Taunt() { // Check the random chance of taunting. float tauntChance = Random.Range(0f, 100f); if(tauntChance > tauntProbability) { // Wait for tauntDelay number of seconds. yield return new WaitForSeconds(tauntDelay); // If there is no clip currently playing. if(!audio.isPlaying) { // Choose a random, but different taunt. tauntIndex = TauntRandom(); // Play the new taunt. audio.clip = taunts[tauntIndex]; audio.Play(); } } } int TauntRandom() { // Choose a random index of the taunts array. int i = Random.Range(0, taunts.Length); // If it's the same as the previous taunt... if(i == tauntIndex) // ... try another random taunt. return TauntRandom(); else // Otherwise return this index. return i; } }
1、AudioClip 接口是用于播放音频剪辑的简单抽象。多个 AudioClip 项能够同时播放,得到的声音混合在一起可产生合成声音
play
void play()开始播放此音频剪辑。每次调用此方法时,剪辑都从头开始重新播放。
loop
void loop()以循环方式开始播放此音频剪辑。
stop
void stop()停止播放此音频剪辑。
2、
unity input类操作
Input 输入
按键
Input.GetKey(“up”) = Input.GetKey(KeyCode.UpArrow) 按住键盘上键
Input.GetKeyDown (“up”) 按下键盘上键
Input.GetKeyUp (“up”) 放开键盘上键
(KeyCode.UpArrow)为键码
Input.GetButton(“ ”) = Input.GetKey(“ ”) 两种几乎相同(目前没发现差异)
Input.GetButton一样会有分Input.GetButtonDown & Input.GetButtonUp
(“ ”)符号内为按键英文~ 参考Unity→Edit→Project Settings→Input(可新增)
滑鼠用
Input.GetMouseButton(0) 当0键被按住持续侦测(包含down和up各一次)
Input.GetMouseButtonDown(0) 当0键被按下一次
Input.GetMouseButtonUp(0) 当0键放开一次
PS : 0=左 1=中 2=右
获取轴
Input.GetAxis(“ ”) ~ (“ ”)参考Unity→Edit→Project Settings→Input(可新增)
根据坐标轴传回虚拟座标值,取得输入装置输入时值范围-1 ~ 1
例: Input.GetAxis(“Mouse x”) ~ 可取得滑鼠横向移动增量
Android 常用 Input
触碰
Input.touchCount ~ 触碰数量
Input.GetTouch(0) ~ 当第一支手指触碰时
0=第一支1=第二支2=第三支以此类推(触碰到点的侦测数量上限未测不知)
TouchPhase ~ 触碰状态有分五种Began Moved Stationary Ended Canceled
Began按下Moved移动Stationary按住没移动Ended离开
Canceled用于触碰超过5点以上或贴至脸上时取消追踪
Input.GetTouch(0).position 取得第一支手指触碰座标
例 :
Touch 单点移动判断式
if(Input.touchCount == 1 && Input.GetTouch(0).phase==TouchPhase.Moved){执行}
(触碰数量为1个) 和(第一支手指触碰时的状态为移动) 时{执行}
Touch 双点移动判断式
if(Input.touchCount >1){
if(Input.GetTouch(0).phase==TouchPhase.Moved || Input.GetTouch(1).phase==TouchPhase.Moved){ 执行}}
(触碰数量超过1个) 和
(第一支手指触碰时的状态为移动)或着(第二支手指触碰时的状态为移动) 时{执行}
Input.GetTouch(0) 和 Input.GetMouseButton(0)
单点时大致上互通(不确定是否完全相同)
多点上就会出现差异Touch会取手指前后顺序Mouse会取中心点