1.建立游戏场景模型dom
使用unity的地形 或者通常都是在建模软件里面作好,好比我就是用C4D.导出FBX文件 注意贴图丢失的问题,记得放在一个文件夹下面,FBX和贴图文件:像
2.导入模型到unity编辑器
模型的天空贴图会丢失,那就建立unity本身的天空材质:[建立unity天空方法][1] 创建cube盒子在模型里,要否则会穿过盒子,也没有更好的方法呢?🤔 导入人物(这里是下载unity-chan)
3.摄像机人物跟随oop
若是模型里有摄像机或者c4d编辑器,记得要删除。 创建scrip文件夹 创建跟随脚本,放在摄像机里面,摄像机放在人物里面:[unity控制摄像机跟随][2]
4.场景的切换
save 场景,添加到build
写代码绑到cube上动画
5.unity自带的UI系统
Text 游戏时间,游戏人物血条ui
6.怪物AI系统;this
(1)导入怪物,带动话的 (2)添加角色控制机器 character controller (3)传统的动画系统 添加 Animation 设置好size; (4)写代码,public target 添加,把玩家放入target里面;
using System.Collections; using System.Collections.Generic; using UnityEngine; public class AIControllor : MonoBehaviour { public Transform target; public float rotateSpeed = 30.0f; public CharacterController characterController; private Animation ani; public float directionTravektime = 2.0f;//转方向的间隔时间 private float timeToNewDirection = 0.0f;//计时器 public float idleTime = 1.5f; public float walkeSpeed = 3.0f; public float attackMovieSpeed = 5.0f; public float attacktDistance = 15.0f; public bool isAttack = false; public Vector3 attackPosition = new Vector3(0, 1, 0); public float attackRadius = 5.0f; public float damage = 1.0f; public float lastAttackTime = 0.0f; private Vector3 distanceToPlayer; // Use this for initialization void Start() { characterController = GetComponent<CharacterController>(); ani = GetComponent<Animation>(); if (!target) { target = GameObject.FindWithTag("Actor").transform; } //使用动画循环模式。 ani.wrapMode = WrapMode.Loop; ani["EBunny_Death"].wrapMode = WrapMode.Once; ani["EBunny_Death"].layer = 5; ani["EBunny_Hit"].layer = 3; ani["EBunny_Attack"].layer = 1; StartCoroutine(InitEnemy()); } IEnumerator InitEnemy() { while (true) { yield return StartCoroutine(Idle()); yield return StartCoroutine(Attack()); } } IEnumerator Idle() { while (true) { if (Time.time > timeToNewDirection) { //到了转方向的时间 // yield return new WaitForSeconds(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 + directionTravektime; } //zhaun huan zuo biao Vector3 walkForward = transform.TransformDirection(Vector3.forward); characterController.SimpleMove(walkForward * walkeSpeed); //he player de jv li distanceToPlayer = transform.position - target.position; if (distanceToPlayer.magnitude < attacktDistance) { //ru guo jv li xiaoyv xun luo yield break; } yield return null; } } IEnumerator Attack() { isAttack = true; ani.Play("EBunny_Attack"); //kan zhe zhu jiao transform.LookAt(target); Vector3 direction = transform.TransformDirection(Vector3.forward * attackMovieSpeed); characterController.SimpleMove(direction); bool lostSight = false; while (!lostSight) { //ji shuan player de jv li Vector3 location = transform.TransformPoint(attackPosition) - target.position; if (Time.time > lastAttackTime + 2.0f && location.magnitude < attackRadius) { target.SendMessage("ApplyDamage", damage); lastAttackTime = Time.time; } if (location.magnitude > attackRadius) { lostSight = true; yield break; } yield return null; } isAttack = false; yield return null; } // Update is called once per frame void Update() { } }