交互式戏剧设计师 interactive-theatre-designer

这个技能用于设计和创建交互式戏剧体验,通过分支叙事、观众参与系统和沉浸式环境叙事,让观众参与、影响或共同创作表演。关键词:交互式戏剧、分支叙事、观众参与、沉浸式设计、实时系统、混合格式、戏剧设计、互动体验。

其他 0 次安装 0 次浏览 更新于 3/7/2026

名称: 交互式戏剧设计师 描述: 设计具有分支叙事、观众参与系统和沉浸式环境叙事的交互式戏剧体验。 许可证: MIT

交互式戏剧设计师

本技能提供指导,用于创建戏剧体验,让观众通过交互式系统和分支叙事参与、影响或共同创作表演。

核心能力

  • 分支叙事: 多路径故事结构
  • 观众能动性: 有意义的选项和参与
  • 沉浸式设计: 环境叙事、特定场地作品
  • 实时系统: 实时适应和涌现
  • 混合格式: 物理/数字整合

交互式戏剧基础

交互性频谱

被动                                                     主动
│                                                              │
├──传统──┬──漫步式──┬──沉浸式──┬──参与式──┤
│   戏剧   │   戏剧   │   戏剧   │   戏剧    │
│               │             │             │                 │
│ 固定座位   │ 观众    │ 观众    │ 观众        │
│ 第四堵墙   │ 移动       │ 在故事世界中│ 影响         │
│ 无能动性     │ 部分能动性│ 一些能动性│ 完全能动性     │
└───────────────┴─────────────┴─────────────┴─────────────────┘

参与模式

模式 描述 设计挑战
见证者 从内部观察 管理视线、亲密性
探索者 选择去哪里 平衡错失恐惧、奖励好奇心
玩家 做出故事选择 创建有意义的赌注
共同创作者 生成内容 搭建创意框架
表演者 成为角色 降低抑制障碍

分支叙事设计

结构类型

带变体的线性
A ──→ B ──→ C ──→ D
      ↓
      B' (基于早期选择的变体)

分支树
      ┌── B1 ──→ C1
A ────┤
      └── B2 ──→ C2 ──┬── D1
                      └── D2

折叠路径 (重收敛)
      ┌── B1 ──┐
A ────┤        ├──→ D
      └── B2 ──┘

中心和辐条
         ┌── B ──┐
    ┌────┤       │
A ──┤    └───────┘
    │    ┌── C ──┐
    └────┤       │
         └───────┘

平行线程
A1 ───────→ B1 ───────→ C1
            ↕ 同步
A2 ───────→ B2 ───────→ C2

选择架构

class NarrativeChoice:
    """故事中的决策点"""

    def __init__(self, prompt, options):
        self.prompt = prompt
        self.options = options
        self.context_requirements = []
        self.consequences = {}

    def evaluate_options(self, audience_state):
        """基于状态确定可用选项"""
        available = []
        for option in self.options:
            if option.is_available(audience_state):
                available.append(option)

        # 始终确保至少有两个有意义的选项
        if len(available) < 2:
            available.append(self._create_fallback_option())

        return available


class StoryBeat:
    """叙事动作单元"""

    def __init__(self, content, duration_range, choice=None):
        self.content = content
        self.min_duration = duration_range[0]
        self.max_duration = duration_range[1]
        self.choice = choice  # 可选的NarrativeChoice
        self.state_changes = {}  # 此节拍修改的内容
        self.prerequisites = []  # 达到此节拍必须为真的条件

后果系统

class ConsequenceTracker:
    """跟踪选择及其连锁效应"""

    def __init__(self):
        self.choices_made = []
        self.world_state = {}
        self.character_relationships = {}
        self.available_endings = set()

    def record_choice(self, choice_id, option_selected, timestamp):
        self.choices_made.append({
            'choice': choice_id,
            'selected': option_selected,
            'time': timestamp
        })
        self._apply_consequences(choice_id, option_selected)
        self._update_available_endings()

    def _apply_consequences(self, choice_id, option):
        """应用即时和延迟后果"""
        # 即时效果
        for effect in option.immediate_effects:
            self._apply_effect(effect)

        # 队列延迟效果
        for effect in option.delayed_effects:
            self._queue_effect(effect)

    def get_story_fingerprint(self):
        """此观众旅程的唯一标识符"""
        return hash(tuple(
            (c['choice'], c['selected'])
            for c in self.choices_made
        ))

观众能动性设计

选择设计原则

让选择有意义:

  • 清晰赌注:什么是风险?
  • 可见后果:可以观察到的变化
  • 情感投入:关心的角色
  • 无“正确”答案:多个有效路径

避免选择瘫痪:

  • 限制决策点选项为2-4个
  • 提供足够上下文(但不要过多)
  • 谨慎和有目的地使用时间压力
  • 信号选择的重要性级别

投票和集体选择

class CollectiveDecision:
    """将观众输入聚合成故事决策"""

    def __init__(self, voting_method='plurality'):
        self.voting_method = voting_method
        self.votes = {}

    def collect_votes(self, options, timeout_seconds=30):
        """从观众收集投票"""
        # 方法:举手、移动应用、身体移动、声音
        pass

    def resolve(self):
        """基于投票方法确定结果"""
        methods = {
            'plurality': self._plurality,      # 最多票数获胜
            'supermajority': self._supermajority,  # 需要2/3
            'consensus': self._consensus,      # 一致同意
            'weighted': self._weighted,        # 某些票数权重更高
            'random_delegate': self._delegate  # 一人决定
        }
        return methods[self.voting_method]()

    def _plurality(self):
        return max(self.votes.keys(), key=lambda x: self.votes[x])

个体 vs 集体能动性

方法 优点 缺点
个体选择 个人投入 后勤复杂性
集体投票 易于管理 少数感到被忽视
代表制 两者平衡 选择代表
平行路径 每个人都获得能动性 需要更多内容

沉浸式环境设计

空间作为叙事

传统舞台          沉浸式空间

┌─────────────────┐       ┌─────────────────────────────┐
│                 │       │  花园    │    图书馆    │
│      舞台      │       │  (过去)   │    (记忆)   │
│                 │       │     ◇      ↔      ◇        │
├─────────────────┤       ├────────────┼───────────────┤
│    观众     │       │  厨房   │    卧室    │
│                 │       │  (现在)   │    (未来)   │
└─────────────────┘       │     ◇      ↔      ◇        │
                          └─────────────────────────────┘
                               ◇ = 表演热点
                               ↔ = 观众流动路径

环境叙事元素

class ImmersiveSpace:
    """设计沉浸式戏剧环境"""

    def __init__(self, venue):
        self.venue = venue
        self.zones = {}
        self.artifacts = []
        self.ambient_states = {}

    def add_zone(self, zone):
        """定义叙事区域"""
        self.zones[zone.name] = zone

    def design_discovery_path(self, story_beats):
        """创建环境叙事弧"""
        path = []
        for beat in story_beats:
            zone = self._select_zone_for_beat(beat)
            artifacts = self._place_artifacts(beat, zone)
            ambient = self._set_ambient_state(beat, zone)
            path.append({
                'beat': beat,
                'zone': zone,
                'artifacts': artifacts,
                'ambient': ambient
            })
        return path


class NarrativeArtifact:
    """发现时讲述故事的对象"""

    def __init__(self, name, backstory, discovery_trigger):
        self.name = name
        self.backstory = backstory  # 揭示的内容
        self.discovery_trigger = discovery_trigger  # 如何发现
        self.required_for_story = False
        self.hidden_level = 0  # 0=明显,5=非常隐藏

感官设计

感官 叙事用途 技术考虑
视觉 角色、情绪、焦点 灯光图、布景
音频 氛围、过渡 扬声器、声学设计
嗅觉 记忆、地点、情感 气味机、自然
触觉 纹理、温度 材料选择
味觉 仪式、共享 食品安全、过敏

实时系统设计

实时适应

class ShowController:
    """基于观众行为管理现场表演"""

    def __init__(self, script, performers, systems):
        self.script = script
        self.performers = performers
        self.systems = systems  # 灯光、声音、效果
        self.current_beat = None
        self.audience_state = AudienceState()

    def update(self):
        """在表演期间连续调用"""
        # 观察观众
        self.audience_state.update(self._observe_audience())

        # 检查触发器
        triggers = self._check_triggers()

        # 如果需要,适应
        for trigger in triggers:
            self._handle_trigger(trigger)

        # 提示表演者
        self._send_performer_cues()

    def _check_triggers(self):
        """检测需要适应的条件"""
        triggers = []

        # 观众参与度低
        if self.audience_state.engagement < 0.3:
            triggers.append(('low_engagement', 'intensify'))

        # 观众移动到意外区域
        if self._unexpected_movement():
            triggers.append(('migration', 'redirect_or_adapt'))

        # 时间超时/不足
        pace = self._calculate_pace()
        if pace < 0.8:
            triggers.append(('slow_pace', 'compress'))
        elif pace > 1.2:
            triggers.append(('fast_pace', 'expand'))

        return triggers

表演者通信

class PerformerCueSystem:
    """与表演者的实时通信"""

    def __init__(self):
        self.performers = {}
        self.cue_queue = []

    def add_performer(self, name, device_type):
        """注册表演者及其提示设备"""
        self.performers[name] = {
            'device': device_type,  # 'earpiece', 'wearable', 'visual'
            'current_track': None,
            'status': 'ready'
        }

    def send_cue(self, performer, cue_type, content, urgency='normal'):
        """向特定表演者发送提示"""
        cue = {
            'performer': performer,
            'type': cue_type,  # 'go', 'hold', 'redirect', 'improv'
            'content': content,
            'urgency': urgency
        }
        self._transmit(cue)

    def broadcast_state_change(self, new_state):
        """通知所有表演者故事状态变化"""
        for performer in self.performers:
            self.send_cue(
                performer,
                'state_change',
                new_state,
                urgency='low'
            )

文档和规划

表演圣经结构

## [表演标题] 制作圣经

### 概念
- 一句话梗概
- 主题
- 观众体验目标

### 叙事
- 故事摘要(非分支核心)
- 分支点和选项
- 结局(及如何达到)
- 角色分解

### 空间
- 场地要求
- 区域地图
- 物品清单
- 技术要求

### 交互性
- 选择点目录
- 参与机制
- 边缘情况和恢复

### 操作
- 观众旅程图
- 表演者轨道
- 舞台管理协议
- 紧急程序

运行表格式

时间    | 节拍           | 动作                | 触发器
--------|----------------|----------------------|------------------
0:00    | 聚集      | 观众入场      | N/A
0:15    | 介绍          | 主持人欢迎         | 所有在场
0:20    | 选择1       | 投票路径         | 2分钟计时器
0:22    | 分支A或B  | 分割观众       | 投票结果
...     | ...            | ...                  | ...
1:45    | 汇聚    | 所有路径相遇       | 所有组到达
2:00    | 终场         | 最终选择         | 计时器
2:10    | 结束            | 场灯         | 掌声

最佳实践

为失败设计

  • 计划空房间(无人选择该路径)
  • 计划拥挤房间(所有人都选择相同路径)
  • 计划困惑观众(不清楚指示)
  • 计划干扰参与者(优雅管理)
  • 计划技术故障(降级模式操作)

排练过程

  1. 纸面原型: 先纸上走通
  2. 走位排练: 测试间距和移动
  3. 分支排练: 单独练习每条路径
  4. 整合: 运行完整表演与选择
  5. 观众测试: 邀请观众反馈
  6. 技术: 添加所有技术元素
  7. 预演: 公众表演以完善

参考资料

  • references/choice-architecture.md - 设计有意义的决策
  • references/immersive-case-studies.md - 知名作品分析
  • references/live-systems-tech.md - 技术实施模式