zoukankan      html  css  js  c++  java
  • 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会取中心点

     

     

     

     

  • 相关阅读:
    分布式事务的解决方案
    普通平衡树(bzoj 3224)
    [学习笔记] 树链剖分
    矩阵树定理——矩阵树不是树
    哈夫曼树
    SDOI2018一轮NOI培训 题目整理
    Luogu P1119 灾后重建
    轻量级ORM框架——第二篇:Dapper中的一些复杂操作和inner join应该注意的坑(转)
    单点登录的设计与实现
    PHP如何进阶,提升自己
  • 原文地址:https://www.cnblogs.com/wshyj/p/6345176.html
Copyright © 2011-2022 走看看