您的位置:首页 > 编程语言 > C#

用C#来谈关于朝向问题

2015-07-07 17:14 513 查看
这是一篇关于Tank炮塔转向问题,当玩家坦克距敌人30米远时炮塔就会自动转向敌人,同时这脚本也可以加在敌人身上

脚本:

using UnityEngine;
using System.Collections;

public enum EnemyTypea
{ //枚举敌人的类型
Enemy0,
Enemy1
}

public class enemyMove : MonoBehaviour {

public EnemyTypea enemType = EnemyTypea.Enemy0;//敌人枚举类型  (策划可选)
public GameObject player;//<span style="font-family: Arial, Helvetica, sans-serif;">玩家</span><span style="font-family: Arial, Helvetica, sans-serif;">游戏对象</span>

private const int EMEMY_NORMAL = 0;//敌人的状态 普通状态
private const int EMEMY_ROTATTON = 1;//旋转状态
private const int EMEMY_RUN = 2;//奔跑状态
private const int EMEMY_CHASE = 3;//追击玩家状态
private const int EMEMY_ATTACK = 4;//攻击<span style="font-family: Arial, Helvetica, sans-serif;">玩家</span><span style="font-family: Arial, Helvetica, sans-serif;">状态</span>

private int state;//记录当前敌人的状态,然后根据不同的类型的敌人播放不同类型的动画

private int rotation_state;//旋转状态敌人自身旋转

private float aiTankLastTime;//记录上次敌人状态

void Start()
{
//初始化标志敌人状态 以及动画为循环播放
state = EMEMY_NORMAL;
//			this.animation.wrapMode = WrapMode.Loop;
}

void Update()
{
switch (enemType)
{ //根据策划选择敌人类型 这里面会进行不同的敌人AI
case EnemyTypea.Enemy0:
updateEnemyType0();
break;
case EnemyTypea.Enemy1:
UpdateEnemyType1();
break;
}
}
void updateEnemyType0()//更新第一种敌人的AI
{
// 当<span style="font-family: Arial, Helvetica, sans-serif;">玩家</span><span style="font-family: Arial, Helvetica, sans-serif;">与他的距离小于十米时 就会自动朝向主角</span>
if (Vector3.Distance(player.transform.position, this.transform.position) <= 50)
{
this.transform.LookAt(player.transform);
}
}

void UpdateEnemyType1()//更新第二种敌人的AI
{
if (isAIthank())//判断敌人是否开始思考
{
AIthankEnemyState(3);//敌人开始思考
}
else
{
UpdateEmenyState();//敌人状态更新
}
}
int getRandom(int count)
{
return new System.Random().Next(count);
}
bool isAIthank()
{
if (Time.time - aiTankLastTime >= 3.0f)//这里表示敌人每3秒进行一次思考
{
aiTankLastTime = Time.time;
return true;
}
return false;
}

void AIthankEnemyState(int count)
{
int d = getRandom(count);
switch (d)
{
case 0:
setEmemState(EMEMY_NORMAL);
break;
case1:
setEmemState(EMEMY_ROTATTON);
break;
case2:
setEmemState(EMEMY_RUN);
break;
}
}
void setEmemState(int newState)
{
if (state == newState)
return;
state = newState;
string animName = "idle";
switch (state)
{
case EMEMY_NORMAL:
animName = "idle";
break;
case EMEMY_RUN:
animName = "run_forward";
break;
case EMEMY_ROTATTON:
animName = "run_forward";
//当敌人旋转时 开始随机旋转角度系数
rotation_state = getRandom(4);
break;
case EMEMY_CHASE:
animName = "run_forward";
//当敌人进入追击状态时 将面朝<span style="font-family: Arial, Helvetica, sans-serif;">玩家</span><span style="font-family: Arial, Helvetica, sans-serif;">方向奔跑</span>
this.transform.LookAt(player.transform);
break;
case EMEMY_ATTACK:
animName = "run_forward";
//当敌人进入攻击状态时 朝向<span style="font-family: Arial, Helvetica, sans-serif;">玩家</span><span style="font-family: Arial, Helvetica, sans-serif;">开始攻击</span>
this.transform.LookAt(player.transform);
break;
}
/*		if (!this.animation.animation.IsPlaying(animName))//避免重复播放动画  要在这进行一个判断
{
this.animation.Play(animName);//播放动画
}
*/
}
void UpdateEmenyState()
{        //判断敌人与<span style="font-family: Arial, Helvetica, sans-serif;">玩家</span><span style="font-family: Arial, Helvetica, sans-serif;">之间的距离</span>
float distance = Vector3.Distance(player.transform.position, this.transform.position);
if (distance <= 10)//当敌人与<span style="font-family: Arial, Helvetica, sans-serif;">玩家</span><span style="font-family: Arial, Helvetica, sans-serif;">的距离小于10 敌人将开始面朝主角追击</span>
{
if (distance <= 3)
{
setEmemState(EMEMY_ATTACK);
}
else
{
setEmemState(EMEMY_CHASE);//否则敌人将开始面朝<span style="font-family: Arial, Helvetica, sans-serif;">玩家</span><span style="font-family: Arial, Helvetica, sans-serif;">追击</span>
}
}
else
{
if (state == EMEMY_CHASE || state == EMEMY_ATTACK)//敌人攻击<span style="font-family: Arial, Helvetica, sans-serif;">玩家</span><span style="font-family: Arial, Helvetica, sans-serif;">的时候主角迅速移动 当他们之间的距离大于10的时候敌人将会回到正常状态</span>
{
setEmemState(EMEMY_NORMAL);
}
}
switch (state)
{
case EMEMY_ROTATTON:
//旋转状态时 敌人开始旋转 旋转时间为1秒 这样更加具有惯性
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, rotation_state * 90, 0), Time.deltaTime * 1);
break;
case EMEMY_RUN:
transform.Translate(Vector3.forward * 0.02f);//奔跑状态时 敌人向前奔跑
break;
case EMEMY_CHASE:
transform.Translate(Vector3.forward * 0.02f);//追击状态时 敌人向前开始追击
break;
case EMEMY_ATTACK:
break;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: