• Unity随机Prefab,自动前往某点处理


    本文章由cartzhang编写,转载请注明出处。 所有权利保留。 
    文章链接: http://blog.csdn.net/cartzhang/article/details/47337029
    作者:cartzhang


    对与U3D  AI,看了下,自己做了小功能,以备后用啊!


    一,在某区域随机产生某个对象

    C# 文件名称为RadomAPoint.cs

    using UnityEngine;
    using System.Collections;
    
    public class RadomAPoint : MonoBehaviour {
    
        public GameObject mObjArea; // 随机区域
        public GameObject prefabObj;    // 对象prefab
        public string mytag;       // 对象标签
        public string targetTag;    // 目标对象标签
        public int ObjectNumber;    // 场景中整体prefab 个数。
    
        private Bounds mbouds;
        private Vector3 tmp;
    	// Use this for initialization
    	void Start () { 
            mbouds = mObjArea.GetComponent<Collider>().bounds;
            InvokeRepeating("NewPrefabInstance", 1, 5);//1秒后调用LaunchProjectile () 函数,之后每5秒调用一次
    	}
    	
    	// Update is called once per frame
    	void Update () {
           
    	}
    
        void NewPrefabInstance()
        {
            GameObject[] root = GameObject.FindGameObjectsWithTag(mytag);
            if (root.Length <= ObjectNumber)
            {
                Vector3 randomPos = RadomVector3(mbouds.min, mbouds.max);
                //GameObject tmpGameObj = Resources.Load(prefabName) as GameObject;
                //tmpGameObj.transform.position = randomPos;
    
                Quaternion q = Quaternion.identity;
                GameObject tmpGameObj = GameObject.Instantiate(prefabObj, randomPos, q) as GameObject;
                tmpGameObj.GetComponent<AIBehaviourScript>().TargetObject = GameObject.FindWithTag(targetTag).transform;
            }
        }
    
    
        Vector3 RadomVector3(Vector3 min, Vector3 max)
        {        
            tmp.x = Random.Range(min.x, max.x);
            tmp.y= Random.Range(min.y, max.y);
            return tmp;
        }
    }
    


    二、自己做了个prefab,添加了自动找到目标的功能。

    特别简单的代码:


    using UnityEngine;
    using System.Collections;
    
    public class AIBehaviourScript : MonoBehaviour
    {
        public Transform TargetObject = null;
        void Start()
        {
            if (TargetObject != null)
            {
                GetComponent<NavMeshAgent>().destination = TargetObject.position;
            }
        }
    
        void Update()
        {
    
        }
    }
    

    三,遇到目标后,自动销毁


    代码:

    using UnityEngine;
    using System.Collections;
    
    public class BoxCollisionDestory : MonoBehaviour 
    {
        public string tagName;
    
    	// Use this for initialization
    	void Start () {
    	
    	}
    	
    	// Update is called once per frame
    	void Update () {
    	
    	}
    
        void OnTriggerEnter(Collider other)
        {
            if (other.gameObject.tag == tagName)
            {
                GameObject.Destroy(other.gameObject);
            }
    
        }
    }
    


    四,说明

    这个过程中,要设置目标点为的属性如下:



    而prefab对象也需要给它一个rigidbody,否则他们的碰撞不起作用。



    基本上做了一个能随机位置产生一个对象,然后对象自动寻找目的,到达目的地的小功能!


    ---------

    若有问题,请随时联系!

    非常感谢!!





  • 相关阅读:
    Docker系列
    Eclipse 安装TestNG插件,结合Maven使用
    HttpClient设置忽略SSL,实现HTTPS访问, 解决Certificates does not conform to algorithm constraints
    Jenkins Html Rport 使用frame报错解决办法
    Zend Framework1 框架入门(针对Windows,包含安装配置与数据库增删改查)
    Windows下Nginx配置SSL实现Https访问(包含证书生成)
    Windows下Nginx Virtual Host多站点配置详解
    幽灵般的存在:零宽空白
    我的公司培训讲义(2):设计模式思想精要教程
    突如其来而又必然的离职
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461947.html
Copyright © 2020-2023  润新知