Unity5.x制作RPG游戏

先展示下运行效果图:


这里主要介绍主角的控制,敌人的AI逻辑,相机的跟随

可以参考游戏源码来分析点击打开链接

一.主角的控制

添加寻路组件,以及Animation动画组件

CustomEvent.cs

using UnityEngine;
using System.Collections;

public class customEvent : MonoBehaviour {

	/// <summary>
	/// 寻路组件
	/// </summary>
	private NavMeshAgent nav;

	/// <summary>
	/// 动作组件
	/// </summary>
	private Animation ani;
	

	// Use this for initialization
	void Start ()
	{
		//获取寻路组件
		nav=this.transform.GetComponent<NavMeshAgent>();
		//获取动作组件
		ani=this.transform.GetComponent<Animation>();
	}


	// Update is called once per frame
	void Update () 
	{
		//按键
		if(Input.GetKey(KeyCode.Z))
		{
			nav.SetDestination(this.transform.position);

			ani.CrossFade("swordStrike1");
		}
		if(Input.GetKey(KeyCode.X))
		{
			nav.SetDestination(this.transform.position);

			ani.CrossFade("swordStrike2");
		}
		if(Input.GetKey(KeyCode.C))
		{
			nav.SetDestination(this.transform.position);

			ani.CrossFade("swordStrike3");
		}

		//按下鼠标
		if (Input.GetMouseButtonDown (0)) {
			//玩家移动
			MoveCharactor (Input.mousePosition);
		}

		if(Vector3.Distance(this.transform.position,hit.point)<=0.1f)
		{
			//停止动作,恢复原来默认动作
			ReturnIdle();
		}
	}

	private RaycastHit hit;
	void MoveCharactor(Vector3 mousePos)
	{
		Ray ray = Camera.main.ScreenPointToRay (mousePos);

		//将变量hit回调给函数,进行相应处理
		if(Physics.Raycast(ray,out hit))
		{
			if(hit.collider.CompareTag("terrain"))
			{
				//切换动作
				ani.CrossFade("runSword");

				//开始寻路
				nav.SetDestination(hit.point);
				nav.speed=5.0f;
			}
			if(hit.collider.CompareTag("Enemmy"))
			{
				Vector3 enemyPos = hit.transform.position;
				this.transform.rotation=Quaternion.LookRotation(enemyPos);

				nav.SetDestination(hit.point);
				nav.speed=6.0f;
			}
		}  
	}


	void ReturnIdle()
	{
		ani.CrossFade ("swordStrike3");
	}
	
}

二.敌人的人工智能逻辑

敌人的AI逻辑与我之前上一篇文章类似参考

EnemyAI.cs

using UnityEngine;
using System.Collections;

public class EnemyAI : MonoBehaviour {

	/// <summary>
	/// 寻路组件
	/// </summary>
	private NavMeshAgent nav;

	/// <summary>
	/// 动作组件
	/// </summary>
	private Animation ani;

	/// <summary>
	/// 主角
	/// </summary>
	private Transform player;

	/// <summary>
	/// 主角与敌人的距离
	/// </summary>
	public float distance=15;

	/// <summary>
	///是否寻路状态 
	/// </summary>
	private bool isFund=false;

	/// <summary>
	/// 随机值
	/// </summary>
	private int RANDrange=20;

	/// <summary>
	/// 随机位置
	/// </summary>
	Vector3 RandVector;

	// Use this for initialization
	void Start () 
	{
		//获取寻路组件
		nav=this.transform.GetComponent<NavMeshAgent>();

		//获取动作组件
		ani = this.transform.GetComponent<Animation> ();

		//获取主角
		player = GameObject.FindGameObjectWithTag ("Player").transform;
	}
	
	// Update is called once per frame
	void Update () 
	{
		float m_distance = Vector3.Distance (this.transform.position, player.position);

		//敌人在视察范围内
		if (m_distance <= distance) 
		{
			isFund=false;

			//面向主角
			//this.transform.rotation=Quaternion.LookRotation(player.position);

			if (m_distance <= player.GetComponent<NavMeshAgent> ().radius + nav.radius+4.0f) 
			{
				ani.CrossFade ("walk");
			} 
			else 
			{			
				ani.CrossFade ("run");

				//重新寻路
				nav.Resume();
				nav.SetDestination (player.position);
				nav.speed = 3.0f;
			}
		}
		//不在视察范围内,敌人自动行走
		else 
		{
			if(!isFund)
			{
				isFund=true;

				RandVector=new Vector3(Random.Range(-RANDrange,RANDrange),0,Random.Range(-RANDrange,RANDrange))+this.transform.position;

				ani.CrossFade("walk");
				
				nav.SetDestination(RandVector);
			}
			if(Vector3.Distance(this.transform.position,RandVector)<=0.02f)
			{
				isFund=!isFund;
			}
		}
	}
}


三.相机的跟随

(1)按下A和D键相机将绕着主角旋转

(2)滚动鼠标滑轮,将扩大和缩放场景

using UnityEngine;
using System.Collections;

public class CameraFollow : MonoBehaviour {

	/// <summary>
	/// 跟随目标
	/// </summary>
	public Transform target;

	/// <summary>
	/// 平滑速度
	/// </summary>
	public float speed=3.6f;

	/// <summary>
	/// 摄像机与主角方位距离
	/// </summary>
	private Vector3 offset;

	// Use this for initialization
	void Start () 
	{
		offset = this.transform.position - target.position;
	}
	
	// Update is called once per frame
	void Update () 
	{
		if (Input.GetKey (KeyCode.A)) 
		{
			this.transform.RotateAround (target.transform.position, Vector3.up, Time.deltaTime * speed*2);
		}
		if (Input.GetKey (KeyCode.D)) 
		{
			this.transform.RotateAround (target.transform.position, Vector3.up, -Time.deltaTime * speed*2);
		}

		//平滑移动摄像机
		SmoothMoveCamera ();

		//滚动轮子
		if (Input.GetAxis ("Mouse ScrollWheel") < 0) 
		{
			if(Camera.main.fieldOfView<=80.0f)
			{
				Camera.main.fieldOfView+=5.0f;
			}
		}
		if (Input.GetAxis ("Mouse ScrollWheel") > 0)
		{
			if(Camera.main.fieldOfView>=20.0f)
			{
				Camera.main.fieldOfView-=5.0f;
			}
		}

	}


	void SmoothMoveCamera()
	{
		Vector3 cameraFrom = this.transform.position;
		Vector3 cameraTo = target.position + offset;
		this.transform.position =Vector3.Lerp (cameraFrom, cameraTo, Time.deltaTime*speed);
	}
}


本人也在寻找一份游戏开发实习工作,如果大佬们需要开发人员,请把我带走奋斗

这是我的简历:resume.liujunliang.com.cn/resume.pdf

作品的话可以私聊我哦!



  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值