U3D课程学习交流 加入小组

85个成员 32个话题 创建时间:2015-06-03

关于《草原历险记》代码的问题

发表于2015-07-29 1713次查看

 

using UnityEngine;
using System.Collections;

public class ZombieAIController : MonoBehaviour {

    public Transform target;
    public float rotateSpeed = 30.0f; //转向速度
    public float walkSpeed = 3.0f;
    public float attackMoveSpeed = 5.0f; //攻击时的移动速度
    public float attackDistance = 15.0f; //巡逻范围
    public float attackRadius = 2.0f;  //怪物攻击范围
    public float damage = 0.2f; //怪物的伤害值

    public float directionTraveltime = 2.0f; //怪物转方向的时间间隔\
    public float idleTime = 1.5f;
    public bool isAttacking = false;
    public Vector3 attackPosition = new Vector3(0,1,0);

    private CharacterController characterController;
    private float timeToNewDirection = 0.0f;  //计时器
    private Vector3 distanceToPlayer;
    private float lastAttackTime = 0.0f;

    // Use this for initialization
    void Start () {
        characterController = GetComponent<CharacterController> ();

        if(!target)
            target = GameObject.FindWithTag ("Player").transform;

        animation.wrapMode = WrapMode.Loop;
        animation ["die"].wrapMode = WrapMode.Once;

        animation ["die"].layer = 5;
        animation ["hit"].layer = 3;
        animation ["attack1"].layer = 1;

        StartCoroutine (InitEnemy ());
    
    }
    
    IEnumerator InitEnemy(){
        while (true) {
        yield return StartCoroutine( Idle());
        yield return StartCoroutine (Attack());
        }
    }
    
    IEnumerator Idle(){
        while (true) {
            animation.Play ("walk1");
            if(Time.time > timeToNewDirection ){//到了转换方向的时间
                animation.Play ("idle");
                yield return new WaitForSeconds(idleTime);//等待idleTime时间,模拟怪物在思考下一步的方向
                //通过产生随机值,让怪物随机转方向
                if(Random.value > 0.5)
                    transform.Rotate (new Vector3(0,5,0),rotateSpeed);
                else
                    transform.Rotate (new Vector3(0,-5,0),rotateSpeed);
                
                timeToNewDirection = Time.time + directionTraveltime;
            }    
            Vector3 walkForward = transform.TransformDirection (Vector3.forward);
            characterController.SimpleMove(walkForward*walkSpeed);
            
            distanceToPlayer = transform.position - target.position; //算出与目标的距离
            if(distanceToPlayer.magnitude < attackDistance)  //如果两者之间的距离小于巡逻距离,意味着主角已经进入到怪物的巡逻范围
            {
                yield break;
            }
            yield return null;
        }


        
    }

    IEnumerator Attack(){
        isAttacking = true;

        transform.LookAt (target);

        Vector3 direction = transform.TransformDirection (Vector3.forward * attackMoveSpeed);
        characterController.SimpleMove (direction);
        animation.Play ("attack1");

        bool lostSight = false;
        while (!lostSight) {
            if (life.health <= 0) {//防止死了还打(错误)
                //Debug.Log(life.health);
                lostSight = true;
                yield break;
            }
                
            Vector3 location = transform.TransformPoint(attackPosition) - target.position;  //计算与玩家的距离
            if(Time.time >  lastAttackTime + 2.0f && location.magnitude < attackRadius ){

                target.SendMessage("subtracHealth",damage);
                lastAttackTime = Time.time;
            }

            if(location.magnitude > attackRadius)
            {
                lostSight = true;
                yield break;
            }
            yield return null;
        }

        isAttacking = false; 
    }
    


}

 

 

using UnityEngine;
using System.Collections;

public class ZombieStatus : MonoBehaviour {//(无法死亡)
    public float health = 2.5f;


    private bool isDead = false;

    // Use this for initialization
    void Start (){
    
    }
    
    // Update is called once per frame
    void Update (){
    
    }


    public void ApplyDamage(float damage){
        //if (health <= 0)
            //return;

        health -= damage;

        animation.Play ("hit");

        if (health <= 0 && !isDead) {
            health = 0;
            isDead = true;
            StartCoroutine (Die ());
        }


            
    }


    IEnumerator Die(){
        
        animation.Stop ();
        animation.Play ("die");
        Destroy (this.GetComponent<ZombieAIController>());
        yield return new WaitForSeconds(2.0f);
        Destroy (this.gameObject);

    }

    public bool IsDead(){
        return isDead;
    }
}

 

 

发表回复
你还没有登录,请先登录注册