3D游戏第四次作业
一、 基本操作演练
1.下载Fantasy Skybox FREE, 构建自己的游戏场景
答:
首先,我们打开unity,然后打开Asset Store界面,这里一定是要登录的,我们可以提前在unity hub中登录。
在unity中,菜单->Window->Package Manager,下载资源包,导入到项目中。
加入 地形后
游戏对象可以使用unity自带的正方体,圆柱体,球体等基础的资源构建
游戏对象也可以通过基础游戏对象组合构建之后做成预制,以便后来重复使用
游戏对象有许多属性,比较重要的有Transform属性,和纹理材质等
游戏对象可以添加许多组件,来实现不同的特定功能,使效果更加炫酷
游戏对象既可以在图形界面实例化,也可以通过代码实例化
游戏对象可以通过添加对应的脚本来实现不同的行为
二、 牧师与魔鬼 动作分离版
SSAction类
public class SSAction : ScriptableObject {
public bool enable = true; //动作正在进行
public bool destory = false;//动作是否终止
public GameObject gameObject;
public Transform transform;
public ISSActionCallback callback; //动作处理接口
protected SSAction(){}
public virtual void Start () {
throw new System.NotImplementedException();
}
// Update is called once per frame
public virtual void Update () {
throw new System.NotImplementedException();
}
}
SSActionManager类
public class SSActionManger:MonoBehaviour{
private Dictionary<int,SSAction> actions = new Dictionary<int, SSAction>();
private List<SSAction> waitingToAdd = new List<SSAction>();
private List<int> waitingToDelete = new List<int>();
protected void Update(){
foreach (SSAction ac in waitingToAdd){
actions[ac.GetInstanceID()] = ac;
}
waitingToAdd.Clear();
foreach (KeyValuePair<int,SSAction> kv in actions){
SSAction ac = kv.Value;
if(ac.destory){
waitingToDelete.Add(ac.GetInstanceID());
}
else if (ac.enable){
ac.Update();
}
}
foreach(int key in waitingToDelete){
SSAction ac = actions[key];
actions.Remove(key);
DestroyObject(ac);
}
waitingToDelete.Clear();
}
CCMoveToAction类
public class CCMoveToAction:SSAction{
public Vector3 target;
public float speed;
private CCMoveToAction(){}
public static CCMoveToAction getAction(Vector3 target, float speed){
CCMoveToAction action = ScriptableObject.CreateInstance<CCMoveToAction>();
action.target = target;
action.speed = speed;
return action;
}
public override void Update(){//update,并返回动作完成信息
this.transform.position = Vector3.MoveTowards(transform.position,target,speed*Time.deltaTime);
if(transform.position == target){
this.destory = true;
this.callback.SSActionEvent(this);
}
}
public override void Start(){
//do nothing
}
}
CCSequenceAction类
public class CCSequenceAction:SSAction,SSActionCallback{
public List<SSAction> sequence;
public int repeat = 1;
public int index = 0;
public static CCSequenceAction getAction(int repeat,int index,List<SSAction>sequence){
CCSequenceAction action = ScriptableObject.CreateInstance<CCSequenceAction>();
action.sequence = sequence;
action.repeat = repeat;
action.index = index;
return action;
}
public void SSActionEvent(SSAction source){
source.destory = false;
this.index ++;
if(this.index >= sequence.Count){
this.index = 0;
if(repeat>0)
repeat --;
if(repeat == 0){
this.destory = true;
this.callback.SSActionEvent(this);
}
}
}
public override void Update(){
if (sequence.Count == 0) return;
if (index < sequence.Count){
sequence[index].Update();
}
}
public override void Start(){
foreach (SSAction action in sequence){
action.gameObject = this.gameObject;
action.transform = this.transform;
action.callback = this;
action.Start();
}
}
void OnDestory(){
foreach(SSAction action in sequence){
DestroyObject(action);//动作释放
}
}
}
SceneActionManager类
public class SceneActionManager : SSActionManager
{
private SSMoveToAction moveBoatToEndOrStart;
private SequenceAction moveRoleToLandorBoat;
public Controller sceneController;
protected void Start()//
{
sceneController = (Controller)SSDirector.getInstance().CurrentSceneController;
sceneController.actionManager = this;
}
public void moveBoat(GameObject boat, Vector3 target, float speed)
{
moveBoatToEndOrStart = SSMoveToAction.GetSSAction(target, speed);SSMoveToAction
this.RunAction(boat, moveBoatToEndOrStart, this);
}
public void moveRole(GameObject role, Vector3 middle_pos, Vector3 end_pos, float speed)
{
SSAction action1 = SSMoveToAction.GetSSAction(middle_pos, speed);
SSAction action2 = SSMoveToAction.GetSSAction(end_pos, speed);
moveRoleToLandorBoat = SequenceAction.GetSSAcition(1, 0, new List<SSAction> { action1, action2 });
this.RunAction(role, moveRoleToLandorBoat, this);
}
}
Judge类
public class Judge : MonoBehaviour
{
landModel startLand;
landModel endLand;
boatModel boat;
public IJudgeCallback callback;
public Controller sceneController;
void Start ()
{
sceneController = (Controller)SSDirector.getInstance().CurrentSceneController;
startLand = sceneController.startLand;
endLand = sceneController.endLand;
boat = sceneController.boat;
callback = sceneController;
sceneController.judge = this;
}
protected void Update ()
{
int startpriest = (startLand.getRoleNumber())[0];
int startevil = (startLand.getRoleNumber())[1];
int endpriest = (endLand.getRoleNumber())[0];
int enddevil = (endLand.getRoleNumber())[1];
if(endpriest == 3 && enddevil == 3)
return 2;
int [] boatroles = boat.getRoleNumber();
if(boat.getBoatPos() == 0){
startpriest += boat_roles[0];
startdevil += boat_roles[1];
}
else{
endpriest += boat_roles[0];
enddevil += boat_roles[1];
}
if((startpriest > 0 && startpriest < startdevil) || (endpriest>0&&end_priest<enddevil))
return 1;
return 0;
}
}
游戏结果: