首页 > 代码库 > Unity 脚本<2>

Unity 脚本<2>

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类操作

转载2016-06-07 19:53:03

 

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会取中心点

 

 

 

 

Unity 脚本<2>