ai代码 unity3d
2019-01-07 22:07:03 weixin_33595571 阅读数 106
QQ群:476842922(欢迎加群讨论学习)
using UnityEngine;
using System.Collections;

public class wanderingAI : MonoBehaviour {
	public float speed=3.0f;
	public float obstacleRange=5.0f;

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
		transform.Translate (0, 0, speed * Time.deltaTime);

		Ray ray = new Ray (transform.position, transform.forward);
		RaycastHit hit;
		if (Physics.SphereCast (ray, 0.75f, out hit)) {
			if(hit.distance<obstacleRange){
				float angle = Random.Range(-110,110);
				transform.Rotate (0,angle,0);
			}		
		}
	}
}

在这里插入图片描述

2013-05-13 16:49:31 sgnyyy 阅读数 1097
http://blog.csdn.net/libeifs/article/details/6820754
2013-10-14 16:27:49 guqule 阅读数 1022

我们想让怪物知道自己的攻击目标(当然指的是玩家)然后转向和移动来攻击玩家,因此我们先声明需要用到的变量,首先我们需要一个transform类型transform组件决定了场景中所有物体的方位,旋转和缩放。每个物体都有一个变换组件)来记录目标的状态,然后定义两个int类型来设置移动速度跟旋转角度。

定义一个私有变量mytransform用来记录当前怪物的方位。然后在Awake函数中将transform赋给mytransform变量这样做的好处是通过建立缓存将他保存到mytransform变量里 这样就不用每次去取transform的值可以让运算变得更快捷。简单说明一下,Awake在MonoBehavior创建后就立刻调用,Start将在MonoBehavior创建后在该帧Update之前,在该Monobehavior.enabled == true的情况下执行。

接着通过Gameobject的FindGameObjectWithTag得到目标对象 将transform赋值给target。

public class EnemyAI : MonoBehaviour {
     
	
	public Transform target;
	public int movespeed=0;
	public int rotationspeed=0;
	
    private Transform myTransform;
	
	
	
	
	void Awake()
	{
		myTransform=transform;
	}
	
	// Use this for initialization
	void Start () {
		
	GameObject player=GameObject.FindGameObjectWithTag("Player");
		
		target=player.transform;
	}
	

现在已经获得了目标和自身的transform 我们可以试着在他们之间连条线 通过debug的drawline可以很轻松的做到

void Update () {
	 Debug.DrawLine(target.position,myTransform.position,Color.yellow);
	}






2014-04-01 18:52:54 qinyuanpei 阅读数 21973

        大家好,欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei。

       在上一篇文章中,我们基本上实现了一个小地图的功能,今天呢,我们来实现怪物AI,所谓怪物AI就是指我们为怪物编写一定的算法,使其可以具备一定程度的智能化,以增强游戏的可玩性。在一般的RPG游戏中,怪物通常在一个游戏设定的范围内巡逻,当玩家进入怪物的警戒范围时,怪物就会由巡逻状态转变为攻击状态,向玩家进行攻击,那么,我们今天就来实现一个简单的怪物AI吧,下面我们一起来看代码:

using UnityEngine;
using System.Collections;

public class AI : MonoBehaviour {

	//定义怪物的四种状态:站立、行走、奔跑、无所事事
	public const int STATE_STAND=0;
	public const int STATE_WALK=1;
	public const int STATE_RUN=2;
	
	//怪物当前状态
	private int NowState;
	//游戏角色
	public GameObject Hero;
	//怪物思考时间
	public const int AI_THINK_TIME=2;
	//触发怪物攻击的临界距离
	public const int AI_ATTACT_DISTANCE=10;
	
	//上一次思考的时间
	private float LastThinkTime;
	
	void Start () 
	{
		
	}
	
	void Update () 
	{
	   //当敌人与怪物间的距离小于攻击范围半径的时候
	   if(Vector3.Distance(transform.position,Hero.transform.position)<AI_ATTACT_DISTANCE)
	   {
	      //敌人开始奔跑
	      this.GetComponent<Animation>().Play("run");
	      //敌人进入奔跑状态
	      NowState=STATE_RUN;
	      //使敌人面向角色
	      transform.LookAt(Hero.transform);
	      //向玩家靠近
	      transform.Translate(Vector3.forward*Time.deltaTime * 5);
	   }else
	   {
	      //当当前时间与上一次思考时间的差值大于怪物的思考时间时怪物开始思考
	      if(Time.time-LastThinkTime>AI_THINK_TIME)
	      {
	         //开始思考
	         LastThinkTime=Time.time;
	         //获取0-3之间的随机数字
	         int Rnd=Random.Range(0,2);	     
	         //根据随机数值为怪物赋予不同的状态行为
	         switch(Rnd)
	         {
	            case 0:
	            //站立状态
	            this.GetComponent<Animation>().Play("idle");
	            NowState=STATE_STAND;
	            break;
	            
	            case 1:
	            //行走状态
	            //使怪物旋转以完成行走动作
	            Quaternion mRotation=Quaternion.Euler(0,Random.Range(1,5)*90,0);
	            transform.rotation=Quaternion.Slerp(transform.rotation,mRotation,Time.deltaTime*1000);
	            //播放动画
	            this.GetComponent<Animation>().Play("walk");
	            //改变位置
	            transform.Translate(Vector3.forward*Time.deltaTime * 3);
	            NowState=STATE_WALK;
	            break;
	           
	            case 2:
	            //奔跑状态
	            this.GetComponent<Animation>().Play("run");
	            transform.Translate(Vector3.forward*Time.deltaTime * 5);
	            NowState=STATE_RUN;
	            break;
	         } 
	      }
	   }
	}
}

          在上面的代码中,能够触发怪物状态发生变化的有两个条件,第一,是玩家进入了怪物的警范围,此时怪物将面向玩家奔跑靠近;第二,当前时间与怪物上一次思考的时间之差大于怪物的思考时间,此时,怪物将随机作出反应。

          好,下面我们回到游戏界面当中来。


        如图,博主事先从官方资源商店里下载了一个人物模型。在这个模型中,设计者已经为我们设计好了人物动画,我们将这个模型拖放到场景中,调整到合适的位置,并将人物默认动画设置为idle,下面我们将刚才写好的脚本拖放到此模型上,并设置Hero为我们的玩家对象,在这里我们使用了官方提供的第三人称角色控制器组件,最终实现的效果如下 :



       可以看到,在不同的时刻,怪物可以自己执行不同的状态动作,当玩家靠近怪物的时候,会被敌人追击,这就是今天的内容啦,谢谢大家!

  

        

2015-01-14 23:11:58 C1805217287 阅读数 1981
欢迎来到unity学习unity培训unity企业培训教育专区,这里有很多U3D资源U3D培训视频我们致力于打造业内unity3d培训学习第一品牌。


       所谓怪物AI就是指我们为怪物编写一定的算法,使其可以具备一定程度的智能化,以增强游戏的可玩性。在一般的RPG游戏中,怪物通常在一个游戏设定的范围内巡逻,当玩家进入怪物的警戒范围时,怪物就会由巡逻状态转变为攻击状态,向玩家进行攻击,那么,我们今天就来实现一个简单的怪物AI吧,下面我们一起来看代码:
public class AI : MonoBehaviour {

//定义怪物的四种状态:站立、行走、奔跑、无所事事
public const int STATE_STAND=0;
public const int STATE_WALK=1;
public const int STATE_RUN=2;

//怪物当前状态
private int NowState;
//游戏角色
public GameObject Hero;
//怪物思考时间
public const int AI_THINK_TIME=2;
//触发怪物攻击的临界距离
public const int AI_ATTACT_DISTANCE=10;

//上一次思考的时间
private float LastThinkTime;

void Start () 
{

}

void Update () 
{
//当敌人与怪物间的距离小于攻击范围半径的时候
if(Vector3.Distance(transform.position,Hero.transform.position)<AI_ATTACT_DISTANCE)
{
//敌人开始奔跑
this.GetComponent<Animation>().Play("run");
//敌人进入奔跑状态
NowState=STATE_RUN;
//使敌人面向角色
transform.LookAt(Hero.transform);
//向玩家靠近
transform.Translate(Vector3.forward*Time.deltaTime * 5);
}else
{
//当当前时间与上一次思考时间的差值大于怪物的思考时间时怪物开始思考
if(Time.time-LastThinkTime>AI_THINK_TIME)
{
//开始思考
LastThinkTime=Time.time;
//获取0-3之间的随机数字
int Rnd=Random.Range(0,2);
//根据随机数值为怪物赋予不同的状态行为
switch(Rnd)
{
case 0:
//站立状态
this.GetComponent<Animation>().Play("idle");
NowState=STATE_STAND;
break;

case 1:
//行走状态
//使怪物旋转以完成行走动作
Quaternion mRotation=Quaternion.Euler(0,Random.Range(1,5)*90,0);
transform.rotation=Quaternion.Slerp(transform.rotation,mRotation,Time.deltaTime*1000);
//播放动画
this.GetComponent<Animation>().Play("walk");
//改变位置
transform.Translate(Vector3.forward*Time.deltaTime * 3);
NowState=STATE_WALK;
break;

case 2:
//奔跑状态
this.GetComponent<Animation>().Play("run");
transform.Translate(Vector3.forward*Time.deltaTime * 5);
NowState=STATE_RUN;
break;

}
}
}
}

转载:

博文 来自: u010293396

unity3d AI's sight

阅读数 1

Unity3D如何编写AI

阅读数 1136

没有更多推荐了,返回首页